1

我想模拟管道故障,所以我想我需要一个陷阱在一秒钟左右后将其杀死?

#!/bin/bash

set -u
set -o pipefail

cat /dev/zero | cat | cat

但是这样的陷阱是如何实现的呢?

4

3 回答 3

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

grepin between 返回1退出代码(失败),因此设置后,pipefail整体退出代码为1. 工作也是如此pipefail,因为它应该返回管道中任何命令的最后一个非零退出代码。

于 2013-10-01T10:25:54.040 回答
1

但是这样的陷阱是如何实现的呢?

您似乎想知道sigspec应该是什么trap

如果pipefail启用,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,或者如果所有命令都成功退出,则为零。

你要陷阱ERR

例子:

set -u
set -o pipefail

trap 'echo pipefail' ERR

false | true
于 2013-10-01T10:38:22.453 回答
0

要模拟 pipefail,管道中的一个进程应该以非零值退出(如您所知,这通常意味着某种失败)。更多关于管道。是的,向进程发送 SIGKILL 或 SIGINT 信号将导致退出代码高于零,至少在 Linux 上是这样

于 2013-10-01T10:23:36.630 回答