One more Heisenbug ΠΌΠΈΠΌΠΎ ΠΊΡ€ΠΎΠΊΠΎΠ΄ΠΈΠ»

One more Heisenbug ΠΌΠΈΠΌΠΎ ΠΊΡ€ΠΎΠΊΠΎΠ΄ΠΈΠ»

$> set -o pipefail

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

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

Π—Π΄Π΅ΡΡŒ fortune условная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Π΅Π· exit(rand()).

CΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ здСсь Π³Π»ΡŽΡ‡ΠΈΡ‚?

Π›ΠΈΡ€ΠΈΡ‡Π½ΠΎ-историчСскоС отступлСниС

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· с этим Π“Π΅ΠΉΠ·Π΅Π½Π±Π°Π³ΠΎΠΌ я познакомился Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡŒ Π²Π΅ΠΊΠ° Π½Π°Π·Π°Π΄. Π’ΠΎΠ³Π΄Π° для шлюза Π² FaxNET Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· pipes Β«ΠΈΠ³Ρ€Π°ΡŽΡ‰ΠΈΡ… Π² шашки» ΠΏΠΎΠ΄ FreeBSD. Как ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ, я считал сСбя ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΌ ΠΈ достаточно ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ программистом. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ намСрСвался ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всё максимально Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΡƒΠ΄Π΅Π»ΠΈΠ² особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΎΡˆΠΈΠ±ΠΎΠΊβ€¦

УсСрдия Π² Β«Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ошибок» ΠΌΠ½Π΅ Ρ‚ΠΎΠ³Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΎΠΏΡ‹Ρ‚ Π±ΠΎΡ€ΡŒΠ±Ρ‹ с Π±Π°Π³Π°ΠΌΠΈ Π² sendmail ΠΈ uucp/uupc. ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ‚ΠΎΠΉ истории смысла Π½Π΅Ρ‚, Π½ΠΎ боролся с этим Π“Π΅ΠΉΠ·Π΅Π½Π±Π°Π³ΠΎΠΌ я Π½Π΅Π΄Π΅Π»ΠΈ Π΄Π²Π΅ ΠΏΠΎ 10-14 часов. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ запомнилось, ΠΈ Π²ΠΎΡ‚ Π²Ρ‡Π΅Ρ€Π° этот старый Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ снова заглянул Π² гости.

TL;DR ΠžΡ‚Π²Π΅Ρ‚

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° head ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» ΠΎΡ‚ fortune сразу ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку. Если fortune Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ строки, Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² write() Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π»ΠΈΠ±ΠΎ сообщит ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π΅ мСньшСго количСства Π±Π°ΠΉΡ‚ Ρ‡Π΅ΠΌ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, написанная с Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ошибок fortune Π²ΠΏΡ€Π°Π²Π΅ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π² своСм статусС Π²Ρ‹Ρ…ΠΎΠ΄Π°. Π’ΠΎΠ³Π΄Π° ΠΈΠ·-Π·Π° установки set -o pipefail ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

Однако, head ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡƒΡΠΏΠ΅Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ fortune Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΠ³Π΄Π° ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ && echo "ПовСзло!".

Π’ ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΌΠΎΠΈΡ… ΡΠ΅Π³ΠΎΠ΄Π½ΡΡˆΠ½ΠΈΡ… GNUMakefile Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

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

Π’ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ Π½Π° чСловСчСский

Π—Π΄Π΅ΡΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ для GNU Make ΠΈ bash способом Ρƒ компилятора ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΡ†ΠΈΠΈ --version ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΊΡ‚ΠΎ ΠΎΠ½ Ρ‚Π°ΠΊΠΎΠΉ, Π° Ссли опция Π½Π΅ поддСрТиваСтся, Ρ‚ΠΎ подставляСтся Π·Π°Π³Π»ΡƒΡˆΠΊΠ° "Please use GCC or CLANG compatible compiler".

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ boilerplate ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. Π’ этом мСстС ΠΎΠ½ появился Π΄Π°Π²Π½ΠΎ ΠΈ прСкрасно Π²Π΅Π·Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π» (Linux, Solaris, OSX, FreeBSD, WSL ΠΈ Ρ‚.Π΄.). Но Π²Ρ‡Π΅Ρ€Π° Π² AltLinux Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Π­Π»ΡŒΠ±Ρ€ΡƒΜΡ 2000 (E2K) я Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»:

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

ΠŸΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒΡΡ я Π½Π΅ сразу разглядСл старого "Π·Π½Π°ΠΊΠΎΠΌΠΎΠ³ΠΎ". Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ провСрялся Π½Π° "Π­Π»ΡŒΠ±Ρ€ΡƒΡΠ°Ρ…" ΠΈ ΠΏΠΎΠ΄ массой Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… дистрибутивов, Π² Ρ‚ΠΎΠΌ числС с "ΠΠ»ΡŒΡ‚ΠΎΠΌ". Π‘ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ компиляторами, вСрсиями GNU Make ΠΈ bash. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ своСй ΠΎΠΏΠ»ΠΎΡˆΠ½ΠΎΡΡ‚ΠΈ я Ρ‚ΡƒΡ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π».

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ воспроизвСсти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈ/ΠΈΠ»ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π² Ρ‡Π΅ΠΌ Π΄Π΅Π»ΠΎ странностСй стало большС.
Π—Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС:

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

Π§Π΅Ρ€Π΅Π·-Ρ€Π°Π· Ρ‚ΠΎ Π²Ρ‹Π΄Π°Π²Π°Π»ΠΎ лишний тСкст, Ρ‚ΠΎ нСт… НСрСдко ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π·Π°Π»ΠΈΠΏΠ°Π» достаточно Π΄ΠΎΠ»Π³ΠΎ, Π½ΠΎ Ссли ΠΏΠΎΡ‚Ρ‹ΠΊΠ°Ρ‚ΡŒ подольшС Ρ‚ΠΎ всСгда ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈΡΡŒ ΠΎΠ±Π°!

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, strace нашС всё! И Π²ΠΎΡ‚ Π½Π°Π±Ρ€Π°Π² strace-Ρ‚ΠΈΡ€Π°Π΄Ρƒ, Π½ΠΎ Π½Π΅ успСв Π½Π°ΠΆΠ°Ρ‚ΡŒ Enter я ΡƒΠ·Π½Π°Π» своСго старого Π·Π½Π°ΠΊΠΎΠΌΠΎΠ³ΠΎ мистСра Π“Π΅ΠΉΠ·Π΅Π½Π±Π°Π³Π°, Π° Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ… компилятора сСбя самого 25 Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄, Nostalgie… И Ρ€Π΅ΡˆΠΈΠ» Π²Π·Π³Ρ€ΡƒΡΡ‚Π½ΡƒΡ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эту Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ πŸ˜‰

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΊΠ°ΠΊ любой ΡƒΠ²Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ сСбя Π“Π΅ΠΉΠ·Π΅Π½Π±Π°Π³, ΠΏΠΎΠ΄ strace ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Π½Π΅ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ происходит?

  • Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° head Π²ΠΏΡ€Π°Π²Π΅ (скорСС Π΄Π°ΠΆΠ΅ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Π°) Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠ°Π½Π°Π», сразу ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ΅ количСство строк.
  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС cc) ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ нСсколько строк ΠΈ вольна Π΄Π΅Π»Π°Ρ‚ΡŒ это посрСдством Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² write().
  • Если Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ успССт Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» со своСй стороны Π΄ΠΎ окончания записи Π½Π° сторонС писатСля, Ρ‚ΠΎ ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŽ ΠΏΡ€ΠΈΠ»Π΅Ρ‚ΠΈΡ‚ ошибка.
  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Π²ΠΏΡ€Π°Π²Π΅ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ записи Π² ΠΊΠ°Π½Π°Π», Ρ‚Π°ΠΊ ΠΈ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² своСм ΠΊΠΎΠ΄Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.
  • ВслСдствиС установки set -o pipefail ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ (ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΌ) ΠΏΡ€ΠΈ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ хотя Π±Ρ‹ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ || echo "Please use GCC or CLANG compatible compiler".

ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с сигналами. НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° (с автоматичСским Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ/ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ статуса Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ), Π»ΠΈΠ±ΠΎ write() Π²Π΅Ρ€Π½Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎ записи мСньшСго количСства Π±Π°ΠΉΡ‚ΠΎΠ² Ρ‡Π΅ΠΌ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈ установит errno = EPIPE.

ΠšΡ‚ΠΎ Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚?

Π’ описываСмом случаС всС ΠΏΠΎΠ½Π΅ΠΌΠ½ΠΎΠ³Ρƒ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок Π² cc (lcc:1.23.20:Sep—4-2019:e2k-v3-linux) Π½Π΅ являСтся ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠΉ. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠ΅Ρ€Π΅Π±Π΄Π΅Ρ‚ΡŒ, хотя это ΠΈ выявляСт Π²Π½Π΅Π·Π°ΠΏΠ½Ρ‹Π΅ Π½Π΅Π΄ΠΎΡ‡Π΅Ρ‚Ρ‹ Π² boilerplate рассчитанным Π½Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ?

ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

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

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

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

    Π—Π΄Π΅ΡΡŒ Ρ€Π°Π½Π½Π΅Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡ€ΠΈ обслуТивании Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ("Π²Π½ΡƒΡ‚Ρ€ΠΈ" скобок). БоотвСтствСнно, Ссли fortune сообщит Π² статусС ΠΎΠ± ошибки записи Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ°Π½Π°Π», Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ || echo "Ошибка" ΡƒΠΆΠ΅ Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π» ΡƒΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚.

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

    Π—Π΄Π΅ΡΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° cat выступаСт Π΄Π΅ΠΌΠΏΡ„Π΅Ρ€ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EPIPE ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅. Π­Ρ‚ΠΎΠ³ΠΎ достаточно ΠΏΠΎΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄ fortune нСбольшой (нСсколько строк) ΠΈ помСщаСтся Π² канальном Π±ΡƒΡ„Π΅Ρ€Π΅ (ΠΎΡ‚ 512 Π±Π°ΠΉΡ‚ Π΄ΠΎ β‰ˆ64К, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ОБ β‰₯4К). Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ EPIPE ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ошибки ΠΏΡ€ΠΈ записи?

ЕдинствСнно Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅Ρ‚, Π½ΠΎ Π΅ΡΡ‚ΡŒ простыС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ:

  • EPIPE трСбуСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ (ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² статусС Π²Ρ‹Ρ…ΠΎΠ΄Π°) ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… цСлостности. НапримСр, Π² Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ»ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования.
  • EPIPE Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сообщСний. НапримСр, ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ опциям --help ΠΈΠ»ΠΈ --version.
  • Если Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ допустимо ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π΅ ΠΏΠ΅Ρ€Π΅Π΄ | head, Ρ‚ΠΎ EPIPE Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΠ½Π°Ρ‡Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² статусС Π²Ρ‹Ρ…ΠΎΠ΄Π°.

ΠŸΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ случаСм Ρ…ΠΎΡ‡Ρƒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌ МЦБВ ΠΈ AltLinux Π·Π° ΠΎΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’Π°ΡˆΠ° Ρ†Π΅Π»Π΅ΡƒΡΡ‚Ρ€Π΅ΠΌΠ»Ρ‘Π½Π½ΠΎΡΡ‚ΡŒ восхищаСт!
Π’Π°ΠΊ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Camarades, Π΄ΠΎ встрСчи осСнью!

Бпасибо berez Π·Π° исправлСниС очСпяток ΠΈ ошибок.
ΠšΠ”ΠŸΠ’ ΠΎΡ‚ Π“Π΅ΠΎΡ€Π³ΠΈΠΉ А.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com