我想模拟管道故障,所以我想我需要一个陷阱在一秒钟左右后将其杀死?
#!/bin/bash
set -u
set -o pipefail
cat /dev/zero | cat | cat
但是这样的陷阱是如何实现的呢?
您可以执行以下操作:
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
in between 返回1
退出代码(失败),因此设置后,pipefail
整体退出代码为1
. 工作也是如此pipefail
,因为它应该返回管道中任何命令的最后一个非零退出代码。
但是这样的陷阱是如何实现的呢?
您似乎想知道sigspec应该是什么trap
。
如果
pipefail
启用,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,或者如果所有命令都成功退出,则为零。
你要陷阱ERR
。
例子:
set -u
set -o pipefail
trap 'echo pipefail' ERR
false | true
要模拟 pipefail,管道中的一个进程应该以非零值退出(如您所知,这通常意味着某种失败)。更多关于管道。是的,向进程发送 SIGKILL 或 SIGINT 信号将导致退出代码高于零,至少在 Linux 上是这样。