为什么“stdin”在陷阱中被重新分配?

为什么“stdin”在陷阱中被重新分配?

为什么会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是,当我从陷阱内转储堆栈时,我也可以转储stdinstdout节点 ID。通过这种方式,如果我有一个失败的管道,并且每个阶段都会触发一个陷阱并转储一个堆栈,那么我可以通过跟踪stdinand链找出给定堆栈它正在消耗哪些其他堆栈以及它正在生成哪些其他堆栈stdout。如果stdin重新分配管道,我无法构建此链。

相关内容