您可以为整个 Bash 会话重定向 STDERR 吗?

Can you redirect STDERR for an entire Bash session?

关于为单个命令或脚本重定向 stderrstdout 有很多问题。我想要的是将任何 stderr 消息从我的 Bash 会话重定向到日志文件。

我想要一个交互式 bash 会话,其中所有 stderr 都被重定向到一个文件。

是的。

exec 2> elsewhere

或重定向调用命令。

不是一个确切的答案,但这是我使用的。它将在屏幕上显示 STDERR,并将所有 STDOUT 和 STDERR 记录到日志中:

eval  2>&1 >>~/max.log | tee --append ~/bash.log

处理你的问题的糟糕方法:

exec 3>&2
trap 'exec 2>>/path/to/your_file' DEBUG
PROMPT_COMMAND='exec 2>&3'
  • exec 3>&2:我们先把fd 2复制到一个新的fd(这里是fd 3)
  • trap 'exec 2>/dev/null' DEBUG:在执行每个命令之前(如果设置了 shell 选项 extdebug,这是交互式 shells 中的默认设置),DEBUG trap 被执行:这里我们将 stderr 重定向到文件 /path/to/your_file (确保你给出了一个绝对路径)。
  • 在显示每个提示之前,Bash执行PROMPT_COMMAND变量中的字符串:这里我们将fd2重定向到fd3(fd3指向终端时是fd2的副本)。这是打印提示所必需的。

我不认为这是一种可靠或不错的方法,但它可能会达到您的目的。