为什么会stdin
在陷阱中重新分配?例如,
my_trap() {
lsof -a -p "$BASHPID" -d 0,1,2
}
lsof -a -p "$BASHPID" -d 0,1,2
trap my_trap ERR
echo hi | grep foo
输出
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 63384 Setup 0u CHR 16,2 0t1112831 3717 /dev/ttys002
bash 63384 Setup 1u CHR 16,2 0t1112831 3717 /dev/ttys002
bash 63384 Setup 2u CHR 16,2 0t1112831 3717 /dev/ttys002
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 63384 Setup 0 PIPE 0xde72f1c4316180fd 16384
bash 63384 Setup 1u CHR 16,2 0t1113091 3717 /dev/ttys002
bash 63384 Setup 2u CHR 16,2 0t1113091 3717 /dev/ttys002
我看到它stdin
被重新分配给了一个管道0xde72f1c4316180fd
。发生了什么?那根管子是什么?我可以看到原始管道的节点 ID 是什么吗stdin
?
stdin
我对陷阱中的和管道感兴趣的原因stdout
是,当我从陷阱内转储堆栈时,我也可以转储stdin
和stdout
节点 ID。通过这种方式,如果我有一个失败的管道,并且每个阶段都会触发一个陷阱并转储一个堆栈,那么我可以通过跟踪stdin
and链找出给定堆栈它正在消耗哪些其他堆栈以及它正在生成哪些其他堆栈stdout
。如果stdin
重新分配管道,我无法构建此链。