$> set -o pipefail
$> fortune | head -1 > /dev/null && echo "ะะพะฒะตะทะปะพ!" || echo "ะั ะฟัะพะธะณัะฐะปะธ"
ะะพะฒะตะทะปะพ!
$> fortune | head -1 > /dev/null && echo "ะะพะฒะตะทะปะพ!" || echo "ะั ะฟัะพะธะณัะฐะปะธ"
ะั ะฟัะพะธะณัะฐะปะธ
์ฌ๊ธฐ์ fortune
์กฐ๊ฑด๋ถ ํ๋ก๊ทธ๋จ exit(rand())
.
์ค๋ช ํด์ฃผ์ค ์ ์๋์? ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด์ผ??
์์ ์ -์ญ์ฌ์ ์ฌ๋ด
๋๋ ์ด Heisenbug๋ฅผ ์ฒ์ ์๊ฒ ๋ ๊ฒ์ XNUMX๋
์ ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ FaxNET์ ๊ฒ์ดํธ์จ์ด์ ๋ํด ๋ค์์ ํตํด ์ฌ๋ฌ ์ ํธ๋ฆฌํฐ๋ฅผ ์์ฑํด์ผ ํ์ต๋๋ค.
์ด์ ์ sendmail ๋ฐ uucp/uupc์ ๋ฒ๊ทธ๋ฅผ ์ฒ๋ฆฌํ ๊ฒฝํ์ผ๋ก ์ธํด "์ฒ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ"์ ๋ํ ๋ ธ๋ ฅ์ด ๋ํด์ก์ต๋๋ค. ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ์์ธํ ํ๊ณ ๋ค ํ์๋ ์์ง๋ง, ์ ๋ ์ด ํ์ด์ ๋ฒ๊ทธ์ 10์ฃผ ๋์ 14~XNUMX์๊ฐ ๋์ ์จ๋ฆํ์ต๋๋ค. ๊ทธ๋์ ๊ธฐ์ต์ ๋จ์๊ณ ์ด์ ์ด ์ ์ง์ธ์ด ๋ค์ ๋ฐฉ๋ฌธํ์ต๋๋ค.
๊ฐ๋ตํ ์ค๋ช ๋ต๋ณ
๊ณต์ต ์ฌ์
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')"'
์ธ๊ฐ์ผ๋ก ๋ฒ์ญ๋จ
์ฌ๊ธฐ์์๋ ํํ ๋ณผ ์ ์๋ ์ผ์
๋๋ค --version
๊ทธ๊ฐ ๋๊ตฌ์ธ์ง ๋ฌป๊ณ ์ต์
์ด ์ง์๋์ง ์์ผ๋ฉด ์คํ
์ด ์ฝ์
๋ฉ๋๋ค. "GCC ๋๋ CLANG ํธํ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค".
๊ฐ์
#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"
์์งํ ๋๋ ๋์ ์ค๋ '์ง์ธ'์ ์ฆ์ ์ธ์ํ์ง ๋ชปํ์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ด ํ๋ก์ ํธ๋ ์ด๋ฏธ Elbrus์ Alt๋ฅผ ํฌํจํ ๋ค์ํ ๋ฐฐํฌํ์์ ์ฌ๋ฌ ๋ฒ ํ ์คํธ๋์์ต๋๋ค. ๋ค์ํ ์ปดํ์ผ๋ฌ, 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
์ฌํํ์ง ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๋ฌด์จ ์ผ์ด์ผ?
- ๊ณต์ต ์ฌ์
head
์์ฒญ๋ ํ ์๋ฅผ ์ฝ๋ ์ฆ์ ์ฝ๊ณ ์๋ ์ฑ๋์ ๋ซ์ ๊ถ๋ฆฌ๊ฐ ์์ต๋๋ค(๋๋ ๊ฐ์ ๋ก). - ๋ฐ์ดํฐ ์์ฑ ํ๋ก๊ทธ๋จ ์์ฑ์(์ด ๊ฒฝ์ฐ
cc
) ์ ์ฌ๋ฌ ์ค์ ์ธ์ํ๊ณ ๋ฌด๋ฃ ์ฌ๋ฌ ๋ฒ์ ํตํ๋ฅผ ํตํด ์ด ์์ ์ ์ํํ์ธ์.write()
. - ๋ฉด ๋ ์๋ ์์ฑ์ ์ธก์ ๋ น์์ด ๋๋๊ธฐ ์ ์ ์์ ์ ์ฑ๋์ ๋ซ์ ์๊ฐ์ ๊ฐ๊ฒ ๋๋ฉฐ, ๊ทธ๋ฌ๋ฉด ์์ฑ์๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
- ์๊ฐ ํ๋ก๊ทธ๋จ ๊ถ๋ฆฌ๊ฐ์๋ค. ๋ ๋ค ์ฑ๋ ์ฐ๊ธฐ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๊ณ ์๋ฃ ์ฝ๋์ ๋ฐ์ํฉ๋๋ค.
- ์ค์น๋ก ์ธํด
set -o pipefail
ํ์ดํ๋ผ์ธ ์๋ฃ ์ฝ๋๋ ํ๋ ์ด์์ ์์์์ ๊ฒฐ๊ณผ๊ฐ XNUMX์ด ์๋๋ฉด XNUMX์ด ์๋๋ฉฐ(์๋ชป๋จ) ์๋ํฉ๋๋ค.|| echo "Please use GCC or CLANG compatible compiler"
.
์์ฑ๊ธฐ ํ๋ก๊ทธ๋จ์ด ์ ํธ์ ํจ๊ป ์๋ํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ฐจ์ด๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ๋ก๊ทธ๋จ์ด ๋น์ ์์ ์ผ๋ก ์ข
๋ฃ๋ ์ ์์ต๋๋ค(XNUMX์ด ์๋ ์ข
๋ฃ/์ค๋ฅ ์ข
๋ฃ ์ํ๊ฐ ์๋์ผ๋ก ์์ฑ๋จ). write()
์์ฒญ ๋ฐ ์ค์ ๋ ๊ฒ๋ณด๋ค ์ ์ ๋ฐ์ดํธ๋ฅผ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. errno = EPIPE
.
๋๊ฐ ํํ ๊ฒ์ ๋๊น?
์ค๋ช
๋ ์ฌ๋ก์ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ ์กฐ๊ธ. ์ค๋ฅ ์ฒ๋ฆฌ cc
(lcc:1.23.20:Sepโ4-2019:e2k-v3-linux) ~์ด ์๋๋ค. ๋ถํ์ํ. ๋ง์ ๊ฒฝ์ฐ์๋ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ค์ํ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ์ ํต์ ์ธ ๋์์ ์ํด ์ค๊ณ๋ ์์ฉ๊ตฌ์ ๊ฐ์์ค๋ฌ์ด ๊ฒฐํจ์ด ๋
ธ์ถ๋ฉ๋๋ค.
๋ฌด์์ํด์ผ ํ๋๊ฐ?
์๋ชป๋:
fortune | head -1 && echo "ะะพะฒะตะทะปะพ, ะฝะพ ะฒั ัะธัะบัะตัะต!" || echo "WTF?"
์ฌ๋ฐ๋ฅด๊ฒ :
-
(fortune && echo "ะฃัะฟะตัะฝะพ" || echo "ะัะธะฑะบะฐ") | head -1
์ฌ๊ธฐ์ ํ์ดํ์ ์กฐ๊ธฐ ๋ซ๊ธฐ๋ ์ค์ฒฉ๋ ํ์ดํ๋ผ์ธ(๊ดํธ "๋ด๋ถ")์ ์๋น์คํ ๋ ๋ช ๋ น ํด์๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ง์ฝ์
fortune
์ํ์์ ๋ซํ ์ฑ๋์ ์ฐ๋ ๋์ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ ๋ค์ ์ถ๋ ฅํฉ๋๋ค.|| echo "ะัะธะฑะบะฐ"
์ฑ๋์ด ์ด๋ฏธ ๋ซํ ์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ฐ๋ ๊ฐ ์ ์์ต๋๋ค. -
fortune | cat - | head -1 && echo "ะฃัะฟะตัะฝะพ" || echo "ะัะธะฑะบะฐ"
์ ํธ๋ฆฌํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cat
์ค๋ฅ๋ฅผ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ ๋ํผ ์ญํ ์ ํฉ๋๋ค.EPIPE
ํํด์. ๊ฒฐ๋ก ์ ์ด ์ ๋๋ฉด ์ถฉ๋ถํ๋คfortune
์๊ณ (์ฌ๋ฌ ์ค) ์ฑ๋ ๋ฒํผ์ ๋ง์ต๋๋ค(๋๋ถ๋ถ์ OS โฅ512K์์ 64๋ฐ์ดํธ ~ 4K). ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ EPIPE
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋
น์ ์ค๋ฅ?
๋จ ํ๋์ ์ฌ๋ฐ๋ฅธ ์๋ฃจ์ ์ ์์ง๋ง ๊ฐ๋จํ ๊ถ์ฅ ์ฌํญ์ด ์์ต๋๋ค.
EPIPE
ํ์ ์ฒ๋ฆฌํด์ผ ํจ (์ข ๋ฃ ์ํ์ ๋ฐ์) ๋ฌด๊ฒฐ์ฑ์ด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๋. ์๋ฅผ ๋ค์ด ์์นด์ด๋ฒ ๋๋ ๋ฐฑ์ ์ ํธ๋ฆฌํฐ๊ฐ ์๋ํ๋ ๋์์ ๋๋ค.EPIPE
๋ฌด์ํ๋ ๊ฒ์ด ๋ซ๋ค ์ ๋ณด ๋ฐ ๋ณด์กฐ ๋ฉ์์ง๋ฅผ ํ์ํ ๋. ์๋ฅผ ๋ค์ด ์ต์ ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ--help
๋๋--version
.- ๊ฐ๋ฐ ์ค์ธ ์ฝ๋๋ฅผ ์ด์ ํ์ดํ๋ผ์ธ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ
| head
, ๊ทธ๋ฐ ๋ค์EPIPE
๋ฌด์ํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌํ์ฌ ์ข ๋ฃ ์ํ์ ๋ฐ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ๊ธฐํ๋ฅผ ๋น์ด ํ์๋ค์๊ฒ ๊ฐ์ฌ์ ๋ง์์ ์ ํ๊ณ ์ถ์ต๋๋ค.
๊ณ์ ํ๋ด์ธ์ Camarades, ์๋ก
๊ฐ์ฌ
KDPV์
์ถ์ฒ : habr.com