$> set -o pipefail
$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Повезло!
$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Вы проиграли
o ti wa ni fortune
ni àídájú eto lai exit(rand())
.
Ṣe o le ṣe alaye? kini aṣiṣe nibi?
Lirical-itan digression
Mo kọkọ mọ Heisenbug yii ni oṣu mẹẹdogun sẹyin. Lẹhinna fun ẹnu-ọna ni FaxNET o jẹ dandan lati ṣẹda ọpọlọpọ awọn ohun elo nipasẹ
Iriri mi iṣaaju ti ṣiṣe pẹlu awọn idun ni sendmail ati uucp/uupc ṣafikun si aisimi mi ni “mimu aṣiṣe ni kikun.” Ko si aaye ni omiwẹ sinu awọn alaye ti itan yẹn, ṣugbọn Mo tiraka pẹlu Heisenbug yii fun ọsẹ meji fun awọn wakati 10-14. Nitorinaa, o ranti, ati ni ana ni ojulumọ atijọ yii duro lati ṣabẹwo lẹẹkansi.
TL; DR Idahun
IwUlO head
le pa ikanni lati fortune
lẹsẹkẹsẹ ni kete bi o ti ka ila akọkọ. Ti o ba jẹ fortune
jade ju ila kan lọ, lẹhinna ipe ti o baamu write()
yoo da aṣiṣe pada tabi jabo pe awọn baiti diẹ ni o jade ju ti o beere lọ. Ni ọna, kọ pẹlu iṣọra aṣiṣe mimu fortune
ni ẹtọ lati ṣe afihan ipo yii ni ipo ijade rẹ. Lẹhinna nitori fifi sori ẹrọ set -o pipefail
yoo ṣiṣẹ || echo "Вы проиграли"
.
Sibẹsibẹ, head
le ma ṣe ni akoko sunmọ ṣaaju ki o to fortune
yoo pari ṣiṣejade data. Lẹhinna o yoo ṣiṣẹ && echo "Повезло!"
.
Ninu ọkan ninu mi loni GNUMakefile
echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"'
Itumọ si eniyan
O wọpọ nibi fun --version
o beere ẹniti o jẹ, ati pe ti aṣayan ko ba ni atilẹyin, lẹhinna a fi stub kan sii "Jọwọ lo GCC tabi CLAG akopo ibaramu".
Bi
#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"
Ni otitọ, Emi ko mọ lẹsẹkẹsẹ “ojulumọ” mi atijọ. Pẹlupẹlu, ise agbese na ti ni idanwo ni ọpọlọpọ igba lori Elbrus ati labẹ ọpọlọpọ awọn pinpin ti o yatọ, pẹlu Alt. Pẹlu ọpọlọpọ awọn akopọ, awọn ẹya ti GNU Rii ati bash. Nitorinaa, Emi ko fẹ lati rii aṣiṣe mi nibi.
Nigbati o ba n gbiyanju lati ṣe atunṣe iṣoro naa ati / tabi loye ohun ti n ṣẹlẹ, awọn ohun ajeji diẹ sii bẹrẹ si ṣẹlẹ.
Akọtọ laini aṣẹ:
echo "#define MDBX_BUILD_COMPILER '$(set -o pipefail; LC_ALL=C cc --version | head -1 || echo "Please use GCC or CLANG compatible compiler")'"
Ni gbogbo igba ati lẹhinna o yoo gbejade ọrọ afikun, lẹhinna kii ṣe… Nigbagbogbo ọkan ninu awọn aṣayan yoo duro fun igba pipẹ, ṣugbọn ti o ba gun gun, o nigbagbogbo ni mejeeji!
Dajudaju, strace
Nipa ona, bi eyikeyi ara-respecting strace
prefers ko lati ẹda.
Nitorina kini o n ṣẹlẹ?
- IwUlO
head
ni ẹtọ (tabi dipo, paapaa fi agbara mu) lati pa ikanni ti a ka ni kete ti o ba ka nọmba ti o beere fun awọn ila. - Onkọwe eto-ti ipilẹṣẹ data (ninu ọran yii
cc
) le tẹ sita ọpọ ila ati ofe ṣe eyi nipasẹ ọpọ awọn ipewrite()
. - ti o ba ti oluka yoo ni akoko lati pa ikanni ti o wa ni ẹgbẹ rẹ ṣaaju ki o to pari igbasilẹ lori ẹgbẹ onkqwe, lẹhinna onkọwe yoo gba aṣiṣe.
- Eto onkqwe ni ẹtọ si mejeeji foju kọ aṣiṣe ikanni ki o ṣe afihan rẹ ninu koodu ipari rẹ.
- Nitori fifi sori ẹrọ
set -o pipefail
koodu ipari pipe yoo jẹ ti kii-odo (aṣiṣe) ti abajade ko ba jẹ odo lati o kere ju ipin kan, ati lẹhinna yoo ṣiṣẹ|| echo "Please use GCC or CLANG compatible compiler"
.
Awọn iyatọ le wa ti o da lori bii eto onkọwe ṣe n ṣiṣẹ pẹlu awọn ifihan agbara. Fun apẹẹrẹ, eto naa le fopin si aiṣedeede (pẹlu iran aifọwọyi ti ipo ifopinsi ti kii-odo/aṣiṣe), tabi write()
yoo da esi ti kikọ diẹ baiti ju beere ati ṣeto errno = EPIPE
.
Tani o jẹbi?
Ninu ọran ti a ṣalaye diẹ ninu ohun gbogbo. Aṣiṣe mimu ni cc
(lcc:1.23.20:Sep—4-2019:e2k-v3-linux) kiise laiṣe. Ni ọpọlọpọ awọn ọran o dara lati ṣe aṣiṣe ni ẹgbẹ iṣọra, botilẹjẹpe eyi ṣe afihan awọn abawọn lojiji ni awo igbomikana ti a ṣe apẹrẹ fun ihuwasi aṣa.
Kini o yẹ ki n ṣe?
Ko tọ:
fortune | head -1 && echo "Повезло, но вы рискуете!" || echo "WTF?"
Ti o tọ:
-
(fortune && echo "Успешно" || echo "Ошибка") | head -1
Nibi, pipadii paipu ni kutukutu yoo jẹ itọju nipasẹ onitumọ aṣẹ nigbati o ba nṣe iranṣẹ opo gigun ti ile ite (“laarin” awọn akọmọ). Gegebi, ti o ba
fortune
yoo jabo aṣiṣe ni kikọ si ikanni pipade ni ipo, lẹhinna o wu jade|| echo "Ошибка"
kii yoo gba nibikibi, niwon ikanni ti wa ni pipade tẹlẹ. -
fortune | cat - | head -1 && echo "Успешно" || echo "Ошибка"
Eyi ni ohun elo naa
cat
Awọn iṣe bi ọririn nitori pe o kọju aṣiṣe naaEPIPE
lori yiyọ kuro. Eyi to fun ipari bayifortune
kekere (awọn ila pupọ) ati pe o baamu ni ifipamọ ikanni (lati 512 baiti si ≈64K, ni ọpọlọpọ OS ≥4K). Bibẹẹkọ, iṣoro naa le pada.
Bi o ṣe le ṣe ilana ti o tọ EPIPE
ati awọn aṣiṣe igbasilẹ miiran?
Ko si ojutu ọtun kan, ṣugbọn awọn iṣeduro ti o rọrun wa:
EPIPE
ti a beere gbọdọ wa ni ilọsiwaju (ati afihan ni ipo ijade) nigbati o ba njade data ti o nilo iduroṣinṣin. Fun apẹẹrẹ, lakoko iṣẹ ti awọn ile ifi nkan pamosi tabi awọn ohun elo afẹyinti.EPIPE
dara lati foju nigbati o nfihan alaye ati awọn ifiranṣẹ iranlọwọ. Fun apẹẹrẹ, nigba fifi alaye han lori awọn aṣayan--help
tabi--version
.- Ti koodu ti n dagbasoke le ṣee lo ni opo gigun ti epo ṣaaju ki o to
| head
lẹhinnaEPIPE
O dara lati foju, bibẹẹkọ o dara lati ṣe ilana ati ṣe afihan ni ipo ijade.
Emi yoo fẹ lati lo anfani yii lati sọ idupẹ mi si awọn ẹgbẹ
Jeki soke Camarades, soke
Спасибо
KDPV lati
orisun: www.habr.com