$> set -o pipefail
$> fortune | head -1 > /dev/null && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ!" || echo "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ"
ΠΠΎΠ²Π΅Π·Π»ΠΎ!
$> fortune | head -1 > /dev/null && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ!" || echo "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ"
ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ
ndi fortune
pulogalamu yokhazikika popanda exit(rand())
.
Kodi mungafotokoze? chavuta ndi chiyani apa?
Lyrical-mbiri digression
Ndidakumana koyamba ndi Heisenbug zaka zana zapitazo. Ndiye pachipata mu FaxNET kunali kofunikira kupanga zida zingapo kudzera
Zomwe ndidakumana nazo m'mbuyomu pothana ndi nsikidzi mu sendmail ndi uucp/uupc zidandiwonjezera khama langa pa "kusamalira zolakwika." Palibe chifukwa chodumphira mwatsatanetsatane za nkhaniyi, koma ndinalimbana ndi Heisenbug iyi kwa milungu iwiri kwa maola 10-14. Chotero, izo zinakumbukiridwa, ndipo dzulo mnzanga wakale ameneyu anaimapo kudzachezanso.
TL; DR Yankho
Zothandiza head
mungathe Tsekani tchanelo kuchokera fortune
nthawi yomweyo akangowerenga mzere woyamba. Ngati fortune
imatulutsa mizere yopitilira umodzi, kenako kuyimba kofanana write()
adzabwezera zolakwika kapena kunena kuti ma byte ochepa amatuluka kuposa momwe akufunira. Komanso, olembedwa ndi kusamala zolakwika akuchitira fortune
ali ndi ufulu wowonetsa momwe zinthu zilili potuluka. Ndiye chifukwa unsembe set -o pipefail
idzagwira ntchito || echo "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ"
.
Komabe, head
sangafike munthawi yake kutseka kale fortune
adzamaliza kutulutsa deta. Ndiye izo zigwira ntchito && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ!"
.
Mu chimodzi changa lero GNUMakefile
echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"'
Kumasuliridwa kukhala munthu
Ndizofala kuno --version
imafunsa kuti iye ndi ndani, ndipo ngati chisankhocho sichikuthandizidwa, ndiye kuti stub imayikidwa "Chonde gwiritsani ntchito compiler yogwirizana ndi GCC kapena CLANG".
Monga
#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"
Kunena zoona, sindinamuzindikire mwamsanga βmnzangaβ wanga wakale. Komanso, ntchitoyi yayesedwa kale nthawi zambiri pa Elbrus komanso pansi pa magawo osiyanasiyana, kuphatikiza Alt. Ndi ma compilers osiyanasiyana, mitundu ya GNU Make ndi bash. Chifukwa chake, sindinkafuna kuwona kulakwitsa kwanga apa.
Poyesa kubweretsanso vutolo ndi/kapena kumvetsetsa zomwe zikuchitika, zinthu zachilendo zinayamba kuchitika.
Mzere wa Command Line:
echo "#define MDBX_BUILD_COMPILER '$(set -o pipefail; LC_ALL=C cc --version | head -1 || echo "Please use GCC or CLANG compatible compiler")'"
Nthawi ndi nthawi zimatulutsa mawu owonjezera, ndiye osati... Nthawi zambiri imodzi mwazosankhayo imatha kukhala kwa nthawi yayitali, koma ngati mutaya nthawi yayitali, mumakhala ndi zonse ziwiri!
Inde, strace
Mwa njira, monga kudzilemekeza kulikonse strace
amakonda kusabereka.
Ndiye chikuchitika ndi chiyani?
- Zothandiza
head
ali ndi ufulu (kapena m'malo mwake, amakakamizika) kutseka tchanelo chomwe chikuwerengedwa akangowerenga nambala yomwe yafunsidwa. - Wolemba mapulogalamu opanga deta (pankhaniyi
cc
) mungathe kusindikiza mizere ingapo ndi mfulu chitani izi kudzera pama foni angapowrite()
. - ngati wowerenga adzakhala ndi nthawi yotseka njira kumbali yake isanathe kujambula kumbali ya wolemba, ndiye wolemba adzalandira cholakwika.
- Pulogalamu ya wolemba ali ndi ufulu onse amanyalanyaza cholakwika cholemba tchanelo ndikuchiwonetsa pamakhodi anu omaliza.
- Chifukwa cha kukhazikitsa
set -o pipefail
khodi yomaliza mapaipi idzakhala yopanda ziro (yolakwika) ngati zotsatira zake siziri ziro kuchokera ku chinthu chimodzi, ndiyeno zidzagwira ntchito.|| echo "Please use GCC or CLANG compatible compiler"
.
Pakhoza kukhala zosiyana malinga ndi momwe pulogalamu yolembera imagwirira ntchito ndi zizindikiro. Mwachitsanzo, pulogalamuyo itha kutha modabwitsa (ndi kutulutsa kopanda zero/kuthetsa zolakwika), kapena write()
adzabweza zotsatira zolembera ma byte ochepa kuposa momwe adafunira ndikuyika errno = EPIPE
.
Ndani ali ndi mlandu?
Pankhani yofotokozedwayo pang'ono pa chirichonse. Zolakwika pogwira cc
(lcc:1.23.20:Sepβ4-2019:e2k-v3-linux) sichoncho zosafunikira. Nthawi zambiri ndikwabwino kulakwitsa kumbali yosamala, ngakhale izi zimawonetsa zolakwika zadzidzidzi mu boilerplate yopangidwira chikhalidwe chachikhalidwe.
Chochita?
Zolakwika:
fortune | head -1 && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ, Π½ΠΎ Π²Ρ ΡΠΈΡΠΊΡΠ΅ΡΠ΅!" || echo "WTF?"
Molondola:
-
(fortune && echo "Π£ΡΠΏΠ΅ΡΠ½ΠΎ" || echo "ΠΡΠΈΠ±ΠΊΠ°") | head -1
Apa, kutseka koyambirira kwa chitoliro kudzayendetsedwa ndi womasulira wolamula pokonza payipi yomwe ili m'chisa ("mkati" mwamakolo). Chifukwa chake, ngati
fortune
adzanena cholakwika polemba ku tchanelo chotsekedwa mu mawonekedwe, kenako zotuluka|| echo "ΠΡΠΈΠ±ΠΊΠ°"
sichifika paliponse, popeza tchanelo chatsekedwa kale. -
fortune | cat - | head -1 && echo "Π£ΡΠΏΠ΅ΡΠ½ΠΎ" || echo "ΠΡΠΈΠ±ΠΊΠ°"
Nayi zothandiza
cat
imakhala ngati damper chifukwa imanyalanyaza cholakwikaEPIPE
pakutuluka. Izi ndi zokwanira pomaliza tsopanofortune
yaing'ono (mizere ingapo) ndipo imalowa mu buffer ya tchanelo (kuchokera pa 512 byte mpaka β64K, mu OS yambiri β₯4K). Apo ayi vuto likhoza kubwerera.
Momwe mungasinthire bwino EPIPE
ndi zolakwika zina zojambulira?
Palibe yankho limodzi lolondola, koma pali malingaliro osavuta:
EPIPE
zofunikira ziyenera kukonzedwa (ndi kuwonetsedwa mumayendedwe otuluka) potulutsa deta yomwe imafunikira kukhulupirika. Mwachitsanzo, pakugwira ntchito kwa archives kapena zosunga zobwezeretsera.EPIPE
bwino kunyalanyaza powonetsa zambiri ndi mauthenga othandizira. Mwachitsanzo, powonetsa zambiri pazosankha--help
kapena--version
.- Ngati code ikupangidwa ingagwiritsidwe ntchito paipi kale
| head
, ndiyeEPIPE
Ndi bwino kunyalanyaza, apo ayi ndi bwino pokonza ndi kusonyeza potuluka udindo.
Ndikufuna kutenga mwayi uwu kuti ndipereke kuthokoza kwanga kumagulu
Pitirizani nazo Camarades, mmwamba
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
KDPV kuchokera
Source: www.habr.com