为什么不能使用 exec 将 stderr 重定向到文件中?

为什么不能使用 exec 将 stderr 重定向到文件中?

我想将 stderr 重定向到一个文件/tmp/mytest

exec 2> /tmp/mytest

输入完回车exec 2> /tmp/mytest,光标停留在那儿,为什么命令exec 2> /tmp/mytest执行不起来?

在此处输入图片描述

答案1

为什么命令exec 2> /tmp/mytest无法完成?

它可以,而且确实如此。您等待的提示转到重定向的 stderr,即/tmp/mytest。从现在开始,无论您输入什么,都将回显到文件,而不是终端。如果您尝试移动光标,那么负责光标移动的序列也将转到文件。

盲目地输入echo foo、点击Enter,看看会发生什么。

(如果没有输出,则意味着在您输入之前命令行很可能不为空echo。但现在可能为空。重复。)

shell 正常运行,您可以执行命令。您无法看到已重定向的内容。

如果您exec 2> /tmp/mytest在脚本中使用,那么其“劫持”提示的能力就无关紧要了,因为解释脚本的 shell 不会像交互式 shell 那样打印提示。例外:

  • 如果你在源脚本exec 2> /tmp/mytest将要影响你从中获取来源的 shell;
  • 脚本中的命令可以打印自己的提示,它们可以使用 stderr 来实现。

问题是关于 Bash 的。许多其他 shell 的行为与 Bash 类似。

值得注意的是,Zsh 不使用 stderr 来打印提示。Zshexec 2> /tmp/mytest不会重定向提示。我猜这是您预期的行为。

相关内容