使用 exec 重定向 stderr

使用 exec 重定向 stderr

我试图将所有命令错误输出重定向到这样的文件:

exec 2>errlog.txt

但是执行上面的行会让我得到一个“冻结”终端 - 该终端根本不响应我的输入。更有趣的是使用重定向标准输出exec效果很好。错误重定向有什么问题?

答案1

exec 2>errlog.txt

如果您使用bash(而不是ksh93dash[1]),那将不是冻结你的终端。这只会阻止 shell 的提示和您输入的字符被回显。

但您稍后可以从errlog.txt;-) 检索它们,您可以通过盲目键入pwd<Enter>或 来轻松检查ls<Enter>:这些命令将正常工作并显示其输出。此外,^C 和 ^Z 将按预期工作。

这里有两件事在起作用:

1)bash始终将其提示符打印到 stderr,而不是打印到控制终端。

2) bash 用于实现命令行编辑的 readline 库将关闭终端上的 echo 标志 [2],并将用户输入的字符打印到 stderr。

如果您启动 bash shell bash --noediting(这将导致它不使用 readline 库),您输入的字符将由 tty 驱动程序回显,并且只有提示符会转到重定向的 stderr。

解决此问题的方法可能是使用tee进程替换:

exec 2> >(trap '' INT; tee errlog.txt >/dev/tty)

[1] 参见这里解释为什么如果这样做某些 shell 会严重失灵,以及为什么它会按预期工作zsh

[2] 请参阅联机帮助页和中的c_lflag/以获取说明。 ECHOtermios(3)stty echostty(1)

相关内容