我想模拟管道故障,所以我猜我需要一个陷阱才能在一秒左右后将其杀死?
#!/bin/bash
set -u
set -o pipefail
cat /dev/zero | cat | cat
但是如何实施这样的陷阱?
答案 0 :(得分:3)
您可以执行以下操作:
echo "a" | grep "b" | sed 's/a/c/g'
echo $?
set -o pipefail
echo "a" | grep "b" | sed 's/a/c/g'
echo $?
打印:
0
1
之间的grep
返回1
退出代码(失败),因此在设置pipefail
后,整体退出代码为1
。所以pipefail
正在工作,因为它应该返回管道中任何命令的最后一个非零退出代码。
答案 1 :(得分:1)
但是如何实施这样的陷阱?
您似乎想知道trap
的 sigspec 应该是什么。
如果启用
pipefail
,则管道的返回状态为值 最后(最右边)命令以非零状态退出,或者为零 如果所有命令都成功退出。
您想要捕获ERR
。
示例:
set -u
set -o pipefail
trap 'echo pipefail' ERR
false | true
答案 2 :(得分:0)
要模拟pipefail,管道中的某个进程应以非零值退出(正如您所知,这通常意味着某种失败)。 More about pipelines。 是的,向进程发送SIGKILL或SIGINT信号将导致退出代码高于零,at least on Linux it does so。