在这个脚本中
我们有一个脚本 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/