$> set -o pipefail
$> fortune | head -1 > /dev/null && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ!" || echo "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ"
ΠΠΎΠ²Π΅Π·Π»ΠΎ!
$> fortune | head -1 > /dev/null && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ!" || echo "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ"
ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ
kuyinto fortune
inkqubo enemiqathango ngaphandle exit(rand())
.
Ngaba unokucacisa? yintoni engalunganga apha?
Ukuphambuka ngokwembali ngokwelizwi
Ndaqala ukuqhelana nale Heisenbug kwikota yenkulungwane eyadlulayo. Ke kwisango kwiFaxNET bekuyimfuneko ukwenza izinto ezininzi nge
Amava am angaphambili okujongana ne-bugs kwi-sendmail kunye ne-uucp / uupc yongeza kwinkuthalo yam "yokuphatha iimpazamo ngokucokisekileyo." Akukho sizathu sokuntywila kwiinkcukacha zelo bali, kodwa ndazabalaza nale Heisenbug iiveki ezimbini kwiiyure ze-10-14. Ngoko ke, yakhunjulwa, kwaye izolo lo mntu wakudala wadlula ukuze atyelele kwakhona.
TL;DR Impendulo
Uncedo head
kungaba vala itshaneli ukusuka fortune
kwangoko nje ukuba efunde umgca wokuqala. Ukuba fortune
ikhupha ngaphezu kwelayini enye, emva koko ifowuno ehambelanayo write()
izakubuyisela imposiso okanye inike ingxelo yokuba zimbalwa ii-bytes eziphumayo kuneziceliweyo. Ngokulandelayo, ibhalwe ngokuphathwa kwempazamo ngononophelo fortune
inelungelo lokubonisa le meko kwimeko yayo yokuphuma. Emva koko ngenxa yofakelo set -o pipefail
izakusebenza || echo "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ"
.
Nangona kunjalo, head
ayinakuyenza ngexesha vala ngaphambili fortune
iyakugqiba ukukhupha idatha. Emva koko iya kusebenza && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ!"
.
Kwenye yam namhlanje GNUMakefile
echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"'
Iguqulelwe ebantwini
Ixhaphakile apha --version
ibuza ukuba ngubani na, kwaye ukuba ukhetho aluxhaswanga, emva koko i-stub ifakiwe "Nceda usebenzise i-GCC okanye iCLANG compiler ehambelanayo".
Njengo
#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"
Ngeliphandle, andizange ndikhawuleze ndimbone βumhloboβ wam wakudala. Ngaphezu koko, le projekthi sele ivavanyiwe amaxesha amaninzi kwi-Elbrus kwaye phantsi konikezelo oluninzi olwahlukeneyo, kubandakanya i-Alt. Ngabaqulunqi abahlukeneyo, iinguqulelo ze-GNU Yenza kunye ne-bash. Ke ngoko, bendingafuni ukubona impazamo yam apha.
Xa uzama ukuvelisa kwakhona ingxaki kunye / okanye ukuqonda oko kwakuqhubeka, izinto ezingaqhelekanga zaqala ukwenzeka.
Upelo lomgca womyalelo:
echo "#define MDBX_BUILD_COMPILER '$(set -o pipefail; LC_ALL=C cc --version | head -1 || echo "Please use GCC or CLANG compatible compiler")'"
Ngalo lonke ixesha izakuvelisa umbhalo owongezelelweyo, emva koko hayi... Rhoqo enye yeendlela zokukhetha inokuncamathela ixesha elide, kodwa ukuba uthe waphoxa ixesha elide, uhlala ufumana zombini!
Kakade, strace
Ngendlela, njengaye nawuphi na ukuzihlonipha strace
ukhetha ukungaphindi.
Kuqhubeka ntoni?
- Uncedo
head
unelungelo (okanye kunoko, unyanzelekile) ukuvala isitishi esifundwayo nje ukuba sifunde inani eliceliweyo lemigca. - Umbhali wenkqubo ovelisa idatha (kule meko
cc
) kungaba printa imigca emininzi kwaye simahla yenza oku ngeefowuni ezininziwrite()
. - ukuba umfundi uya kuba nexesha lokuvala itshaneli kwicala lakhe phambi kokuphela kokurekhoda kwicala lombhali, ngoko umbhali uya kufumana impazamo.
- Inkqubo yombhali unelungelo zombini ziyayihoya impazamo yokubhala isitishi kwaye ziyibonise kwikhowudi yakho yokugqiba.
- Ngenxa yofakelo
set -o pipefail
ikhowudi yokugqibezela umbhobho iyakuba ayingo-zero (impazamo) ukuba isiphumo asingo-zero ukusuka kwinto enye noko, kwaye ke iyakusebenza.|| echo "Please use GCC or CLANG compatible compiler"
.
Kusenokubakho ukuhluka ngokuxhomekeke kwindlela inkqubo yombhali esebenza ngayo ngemiqondiso. Umzekelo, inkqubo inokuphelisa ngokungaqhelekanga (ngokwenza ngokuzenzekelayo imo engeyiyo i-zero/imposiso yokuphelisa), okanye write()
iya kubuyisela isiphumo sokubhala iibhayithi ezimbalwa kuneziceliweyo kwaye iseti errno = EPIPE
.
Ngubani onetyala?
Kwimeko echazwe kancinci kuyo yonke into. Ukuphatha impazamo cc
(lcc:1.23.20:Sepβ4-2019:e2k-v3-linux) ayikho engafunekiyo. Kwiimeko ezininzi kungcono ukwenza impazamo kwicala lokulumkisa, nangona oku kuveza iziphene zequbuliso kwi-boilerplate eyenzelwe ukuziphatha kwendabuko.
Yintoni endiyenzayo?
Banzi:
fortune | head -1 && echo "ΠΠΎΠ²Π΅Π·Π»ΠΎ, Π½ΠΎ Π²Ρ ΡΠΈΡΠΊΡΠ΅ΡΠ΅!" || echo "WTF?"
Ngokuchanekileyo:
-
(fortune && echo "Π£ΡΠΏΠ΅ΡΠ½ΠΎ" || echo "ΠΡΠΈΠ±ΠΊΠ°") | head -1
Apha, ukuvala kwangethuba kombhobho kuya kusingathwa yitoliki yomyalelo xa kulungiswa umbhobho ovalelwe ("ngaphakathi" kwizibiyeli). Ngokufanelekileyo, ukuba
fortune
izakuxela imposiso ngokubhaliweyo kwisitishi esivaliweyo kubume, emva koko imveliso|| echo "ΠΡΠΈΠ±ΠΊΠ°"
ayizukufika naphi na, ekubeni ijelo sele livaliwe. -
fortune | cat - | head -1 && echo "Π£ΡΠΏΠ΅ΡΠ½ΠΎ" || echo "ΠΡΠΈΠ±ΠΊΠ°"
Nantsi into eluncedo
cat
isebenza njengento edambisayo kuba ayihoyi impazamoEPIPE
ekurhoxisweni. Oku kwanele ngoku kwisiphelofortune
encinci (imigca emininzi) kwaye ingena kwi-buffer yesitishi (ukusuka kwi-512 bytes ukuya kwi-β64K, kwii-OS ezininzi β₯4K). Kungenjalo ingxaki inokubuya.
Indlela yokuqhuba ngokuchanekileyo EPIPE
kunye nezinye iimpazamo zokurekhoda?
Akukho sicombululo esinye esilungileyo, kodwa kukho iingcebiso ezilula:
EPIPE
ku funeka kufuneka iqwalaselwe (kwaye ibonakaliswe kwimeko yokuphuma) xa ukhupha idatha efuna ingqibelelo. Ngokomzekelo, ngexesha lokusebenza kwee-archivers okanye i-backup utility.EPIPE
ngcono ukungahoyi xa ubonisa ulwazi kunye nemiyalezo encedisayo. Umzekelo, xa ubonisa ulwazi kwiinketho--help
okanye--version
.- Ukuba ikhowudi ephuhliswayo ingasetyenziswa kumbhobho ngaphambili
| head
, ngokoEPIPE
Kungcono ukungayinaki, ngaphandle koko kungcono ukucubungula kunye nokubonakalisa kwimeko yokuphuma.
Ndingathanda ukuthatha eli thuba ndivakalise umbulelo wam kumaqela
Qhubeka njalo Camarades, phezulu
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
KDPV ukusuka
umthombo: www.habr.com