我试图将所有命令错误输出重定向到这样的文件:
exec 2>errlog.txt
但是执行上面的行会让我得到一个“冻结”终端 - 该终端根本不响应我的输入。更有趣的是使用重定向标准输出exec
效果很好。错误重定向有什么问题?
答案1
exec 2>errlog.txt
如果您使用bash
(而不是ksh93
或dash
[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
/以获取说明。 ECHO
termios(3)
stty echo
stty(1)