在这个脚本中
我们有一个脚本 trap.sh

#!/bin/bash
trap "echo trapped" EXIT
exit 0

和 test.sh。如果 test.sh 就像
#!/bin/bash
. trap.sh

或者
#!/bin/bash
./trap.sh | :

陷阱工程

但是如果 test.sh 就像
#!/bin/bash
. trap.sh | :

陷阱没有用。

有谁知道这是为什么?

最佳答案

我修改了 trap.sh 以包含 xtrace 选项。

#!/bin/bash
set -x
trap 'echo trapped' EXIT
exit 0

运行 trap.sh 作为脚本产生

~ $ ./trap.sh |猫
+ 陷阱“echo 被困”退出
+ 退出 0
+ echo 被困
被困

首先采购它,但是会产生
~ $ . trap.sh | cat
++ trap 'echo trapped' EXIT
++ exit 0

这表明 trap 是在更深的子 shell 中执行的(为什么,我不知道),并且陷阱本身从未执行过(我在第二个实验中通过 touch 确认了一个文件 int he trap 而不是回显,在如果标准输出被继承存在问题;该文件从未被触及)。

我的猜测是,根据手册页中 EXIT 命令描述中的这句话,在执行 source 命令之前,以某种方式忽略了 trap 信号:



结果,trap 命令被执行,但陷阱本身从未注册,因此不会触发。

关于linux - 为什么陷阱在管道中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17741126/

10-14 23:32