【发布时间】:2021-09-12 19:40:00
【问题描述】:
我试图理解为什么 echo 在 bash 脚本中使用时与 echo "Hi"|cat 的行为不同且管道损坏的原因
行为:
-
echo立即终止脚本 -
echo "Hi"|cat管道终止,但脚本继续
示例重现步骤
script_with_echo.sh:
#!/bin/bash
mkfifo ii
cat<ii >/dev/null & echo "KILL : $!"
exec 3>ii
rm ii
while true; do read LINE; echo "$LINE" >&3; echo "$?">/some/external/file;done
script_with_echo_cat.sh:
#!/bin/bash
mkfifo ii
cat<ii >/dev/null & echo "KILL : $!"
exec 3>ii
rm ii
while true; do read LINE; echo "$LINE"|cat>&3; echo "$?">/some/external/file;done
- 在终端 1 上运行脚本(注意
KILL : <PID>) - 向终端 1 输入一些示例行并验证
0(成功退出代码)正在写入/some/external/file - 从终端 2 运行
kill -9 <PID> - 在终端 1 上输入另一条样本行
-
- 如果
script_with_echo.sh在第 1 步中被执行,脚本会立即终止(并且不会向/some/external/file写入错误代码) - 如果
script_with_echo_cat.sh在步骤 1 中被执行,脚本会正常继续(并且对于每个后续的示例行输入,错误代码 141 (SIGPIPE) 将被写入/some/external/file,这是预期的)
- 如果
为什么会出现这种不同的行为?
【问题讨论】:
标签: bash shell pipe pipeline named-pipes