如何调试 stderr 被抑制的原因?

如何调试 stderr 被抑制的原因?

运行一些 shell 函数并按 ctrl-c-ing 它们会导致我的 stderr 被抑制,这样echo hi >&2echo hi > /dev/stderr不会打印任何内容。我想调试这个,但我不知道如何开始。如何检查 stderr 重定向到哪里?在受影响的 shell 中执行 aexec zsh并不能解决此问题,这表明问题确实是由恶意重定向引起的。

我在 macOS 上。

我试过:

ll /dev/fd
crw--w---- 0,11 evar 12 May 18:32 0
crw--w---- 0,11 evar 12 May 18:32 1
crw-rw-rw-  0,2 root 12 May 18:32 2

也许问题在于它的/dev/fd/2所有者是root

更新:

lsof -p $$
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF                NODE NAME
zsh     69568 evar  cwd    DIR    1,6      1472          8624004142 /Users/evar/Base/Lectures
zsh     69568 evar  txt    REG    1,6    618652          8678375637 /usr/local/Cellar/zsh/5.8/bin/zsh
zsh     69568 evar  txt    REG    1,6    452676          8677805768 /usr/local/Cellar/pcre/8.44/lib/libpcre.1.dylib
zsh     69568 evar  txt    REG    1,6    312924          8678370072 /usr/local/Cellar/ncurses/6.2/lib/libncursesw.6.dylib
zsh     69568 evar  txt    REG    1,6    251160          8678375669 /usr/local/Cellar/zsh/5.8/lib/zsh/zle.bundle
zsh     69568 evar  txt    REG    1,6    123012          8678375645 /usr/local/Cellar/zsh/5.8/lib/zsh/complete.bundle
zsh     69568 evar  txt    REG    1,6     65188          8678375676 /usr/local/Cellar/zsh/5.8/lib/zsh/compctl.bundle
zsh     69568 evar  txt    REG    1,6     18220          8678375661 /usr/local/Cellar/zsh/5.8/lib/zsh/terminfo.bundle
zsh     69568 evar  txt    REG    1,6     27888          8678375680 /usr/local/Cellar/zsh/5.8/lib/zsh/system.bundle
zsh     69568 evar  txt    REG    1,6     17240          8678375681 /usr/local/Cellar/zsh/5.8/lib/zsh/langinfo.bundle
zsh     69568 evar  txt    REG    1,6     38064          8678375656 /usr/local/Cellar/zsh/5.8/lib/zsh/parameter.bundle
zsh     69568 evar  txt    REG    1,6     22864          8678375674 /usr/local/Cellar/zsh/5.8/lib/zsh/pcre.bundle
zsh     69568 evar  txt    REG    1,6     37588          8678375667 /usr/local/Cellar/zsh/5.8/lib/zsh/zutil.bundle
zsh     69568 evar  txt    REG    1,6     62316          8678375647 /usr/local/Cellar/zsh/5.8/lib/zsh/complist.bundle
zsh     69568 evar  txt    REG    1,6     22620          8678375675 /usr/local/Cellar/zsh/5.8/lib/zsh/stat.bundle
zsh     69568 evar  txt    REG    1,6     29076          8678375649 /usr/local/Cellar/zsh/5.8/lib/zsh/zpty.bundle
zsh     69568 evar  txt    REG    1,6     18736          8678375668 /usr/local/Cellar/zsh/5.8/lib/zsh/datetime.bundle
zsh     69568 evar  txt    REG    1,6     17628          8678375660 /usr/local/Cellar/zsh/5.8/lib/zsh/zleparameter.bundle
zsh     69568 evar  txt    REG    1,6     18208          8678375654 /usr/local/Cellar/zsh/5.8/lib/zsh/termcap.bundle
zsh     69568 evar  txt    REG    1,6     63728          8678375662 /usr/local/Cellar/zsh/5.8/lib/zsh/computil.bundle
zsh     69568 evar  txt    REG    1,6     22440          8678375673 /usr/local/Cellar/zsh/5.8/lib/zsh/sched.bundle
zsh     69568 evar  txt    REG    1,6   1534352 1152921500311885154 /usr/lib/dyld
zsh     69568 evar    0u   CHR  16,11   0t56261                3469 /dev/ttys011
zsh     69568 evar    1u   CHR  16,11   0t56261                3469 /dev/ttys011
zsh     69568 evar    2w   CHR    3,2 0t1314232                 314 /dev/null
zsh     69568 evar   10u   CHR  16,11   0t21049                3469 /dev/ttys011
zsh     69568 evar   11u   CHR   15,9    0t9086                 583 /dev/ptmx

答案1

获取信息的常用方法是普通的 BSD 命令

fstat -p $$
但是您的列表/dev/fd已经足以告诉您文件描述符 2 没有连接到文件描述符 0 和 1 所连接的终端字符设备。下面的文件的主要和次要编号/dev/fd有点复杂,但它们确实告诉您,连同权限和所有者,这里存在差异。

如果没有显式重定向,在终端登录会话中运行的进程将具有引用相同(终端)字符设备的所有三个描述符。文件描述符0和1很清楚仍然引用您的终端字符设备,该设备由您拥有,并且只能由您读取和写入,这对于登录会话中的终端设备来说很常见。

标准误还没有被“压制”。对它的写入仍在发生,并且被发送到某种字符设备,您不拥有该设备,但您具有写入权限。几乎可以肯定,文件描述符 2 引用的字符设备是/dev/null,并且您已经来源将标准错误重定向到/dev/null类似的脚本

执行 2>/dev/null

因此,在检查了哪些内容fstat告诉你要扩展你的知识之后,再将其重新定向回来。

执行2>&1

相关内容