Unum Heisenbug praeter crocodilum

Unum Heisenbug praeter crocodilum

$> set -o pipefail

$> fortune | head -1 > /dev/null && echo "ПовСзло!" || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ"
ПовСзло!

$> fortune | head -1 > /dev/null && echo "ПовСзло!" || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ"
Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ

est fortune conditionalis progressio sine exit(rand()).

Potesne explicare? quid mali hic??

Digressio lyrico-historica

Hanc Heisenbug primum ante saeculum quartam cognoui. Deinde ad portam in FaxNET plures utilitates per creare necesse erat tibiæ resonabit, "Ludere poculaque" sub FreeBSD. Ut expectatur, provectus et satis peritus me programmator existimavi. Ideo omnia agere quam diligentissime ac diligentissime volui, sedulo intentus errori tractando...

Antecedens experientia mea tractandi cum cimicibus in sendmail et uupc/uupc addita diligentiae meae in "pertractatione erroris." Nihil in singulis illius fabulae tribuo, sed cum hoc Heisenbug per duas septimanas 10-14 horas luctatus sum. Ideo memoratum est, et hesterno die ista vetus notitia impedita est iterum visitare.

TL, DR Answer

utilitas head potes claude alveum fortune simul mox primam aciem legit. Si fortune outputs plus quam una linea, tunc vocationi correspondens write() reddet errorem vel famam pauciores bytes es output quam postulavit. Rursus diligenti errore pertractatio scripta fortune ius habet hanc condicionem considerandi in suo statu exitus. Tum propter institutionem set -o pipefail non operatur || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

autem, head non potest facere in tempore claudere ante fortune notitia outputting consummans. Tum erit opus && echo "ПовСзло!".

In uno meae hodie GNUMakefile est unum fragment:

echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"'

Translata in hominem

Est hic commune GNU make ΠΈ vercundus in compiler via per optionem --version quaerit quis sit, et si optio non sustinetur, stipulam interponi "Quaeso uti GCC vel CLANG compilator compilator".

tamquam boilerplate reperiri usquam potest. Hoc loco iam olim apparebat et ubique perfecte laborabat (Linux, Solaris, OSX, FreeBSD; WSL etc.). Sed heri in altlinux in contionibus Elbrus 2000 (E2K) animadverti;

#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"

Ingenue, non statim agnovi veterem meam "notam". Etiam consilium in Elbro pluries probatum est et sub multa distributione diversa, inter Att. Cum variis compilatoribus, versionibus GNU Fac et vercundus. Ergo errorem meum hic videre non volui.

Cum problemam effingere conatur et/vel intelligere quid ageretur, mirabiliora fieri coepta sunt.
Praecipe line carmine;

echo "#define MDBX_BUILD_COMPILER '$(set -o pipefail; LC_ALL=C cc --version | head -1 || echo "Please use GCC or CLANG compatible compiler")'"

Singula nunc et tunc extra textum produceret, non... Saepe una optionum satis diu haereret, sed si diutius futui, semper utrumque obtinuit!

Scilicet, strace nostri omnia! Et graphio impresso, sed tempus instare non habens Intra, agnovi veterem amicum meum dominum Heisenbug et tincidunt compilator egomet annos XXV; Desiderium… Et placuit contristari et scribere hanc notam

Viam, ut quaelibet de se Heisenbug, in strace mavult non effingere.

Quid igitur agitur?

  • utilitas head ius habet (immo etiam coactum) ad claudendum alveum legebatur ut primum numerum versuum rogatus legerit.
  • Notitia-programma generandi scriptor (in hoc casu cc) potes figuras plures lineas et Liber hoc per plures vocat write().
  • si lector erit tempus claudendi alveum suum ante finem notandi in latere scriptoris, tunc scriptor errorem recipiet.
  • Scriptor progressio potes et canalem ignorare errorem scribe et in codice tuo complementum cogita.
  • Ob institutionem set -o pipefail codice perfectio pipelinea non nulla (erronea) erit si effectus non-nullam ex uno saltem elemento efficiet et tunc operabitur. || echo "Please use GCC or CLANG compatible compiler".

Variationes esse possunt secundum quomodo scriptor programmata cum significationibus operatur. Exempli gratia, progressio enormis terminare potest (generationi latae non-nullae/errore status terminationis), vel write() reddet eventus scribere paucioribus bytes quam rogatus et profectus errno = EPIPE.

Quis est reprehendo?

In casu descriptus paulum ab omnibus. Error pertractatio in cc (lcc:1.23.20:Sepβ€”4-2019:e2k-v3-linux) Non redundans. In multis casibus melius est cavere in parte errare, quamvis haec repentina vitia in boilerplate ad mores institutos exponat.

Quid faciam?

nefas:

fortune | head -1 && echo "ПовСзло, Π½ΠΎ Π²Ρ‹ рискуСтС!" || echo "WTF?"

corrigere;

  1. (fortune && echo "УспСшно" || echo "Ошибка") | head -1

    Hic mane clausura tibiae ab interprete jubente agetur cum in parenthesi nidos ("intra" parenthesi operam daturus est. Proinde, if fortune referat errorem scribendo ad alveum clausum in statu, deinde output || echo "Ошибка" non alicubi, cum canalis iam clausus est.

  2. fortune | cat - | head -1 && echo "УспСшно" || echo "Ошибка"

    Hic est utilitas cat agit damper quia ignorat errorem EPIPE ad receptum angustias. Hoc satis est nunc conclusionem fortune parvae (plures lineae) et in quiddam canali vicium (ab 512 ad bytes ad β‰ˆ64K, in plerisque OS β‰₯4K). Aliter problema redeat.

Quomodo aliquid recte? EPIPE aliosque uetustos errores ?

Recta solutione non est una, sed sunt commendationes simplices;

  • EPIPE requiratur ut processionaliter (Exitus status et reflectitur) cum outputting notitia quod integritas requirit. Exempli gratia, in operatione archivi vel tergum utilitatum.
  • EPIPE melius ignorare Cum nuntia et auxilia nuntians. Exempli gratia, informationes de optionibus ostendens --help aut --version.
  • Si signum crescendo adhiberi potest in pipeline prius | headtum EPIPE Melius est ignorare, aliter melius est procedere et considerare in exitu status.

Vellem hanc occasionem exprimere meam gratiam in iugis MCST ΠΈ altlinux magnum opus fructuosum. Mira sententia tua!
Serva eam Camarades, usque conventus in ruinam!

Бпасибо berez ad corrigendos typos et errores.
KDPV from Georgy A.

Source: www.habr.com