你能否为整个Bash会话重定向标准错误输出(STDERR)?

7

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

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


2
你正在寻找 exec 2>file 吗? - gniourf_gniourf
4
这会隐藏提示/等信息,因为它也使用了 stderr - Etan Reisner
OP,你知道吗,我们并不关心你正在运行演示。我们也不关心它在网络套接字通信方面做了一些非标准的事情。或许我们也不关心你是通过ssh来做这件事的。不要在你的问题中添加太多噪音(到第二段中间我就想关闭选项卡了)。所以:你想要一个交互式的Bash会话,其中stderr被重定向到一个文件中?如果是这样的话,剪切掉所有无用的东西,只包括这些信息。 - gniourf_gniourf
1
@gniourf_gniourf,我整理了一下问题。 - RoraΖ
1
嗯,现在看看这个问题:只有一行,只包含我们需要的信息。 - gniourf_gniourf
显示剩余3条评论
3个回答

7

一种可怕的解决问题的方式:

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,在交互式shell中默认设置),都会执行DEBUG陷阱:这里我们将stderr重定向到文件/path/to/your_file(确保给出绝对路径)。
  • 在显示每个提示符之前,Bash都会执行PROMPT_COMMAND变量中的字符串:这里我们将fd2重定向到fd3(当它指向终端时,fd3是fd2的副本)。这是必要的以打印提示符。

我不认为这是一种健壮或好的方法,但它可能适合您的目的。


1
无论用什么方法完成工作,我都很酷。运行得像魔法一样! - RoraΖ
2
有时候黑客技巧是完成工作的唯一途径 +1 - anubhava

-1

是的。

exec 2> elsewhere

或者重定向调用命令。


5
这对于交互式的 shell 会话来说并不适用。提示信息是写在标准错误输出中的;用户输入也会被回显到标准错误输出中。 - chepner

-4

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

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

1
很难想象在什么情况下 eval $1 是你想要的。也许你的意思是 eval "$1",但这也是非常值得怀疑的。 - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接