运行一些 shell 函数并按 ctrl-c-ing 它们会导致我的 stderr 被抑制,这样echo hi >&2
就echo 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