【问题标题】:BASH: error message does not get redirected to fileBASH:错误消息没有被重定向到文件
【发布时间】:2009-08-27 20:02:35
【问题描述】:

我有一个 bash 脚本,它简单地调用不同的调用并将 stdout 和 stderr 输出重定向到不同的文件。

我已经这样做了:

command 1> datafile 2>> errorfile

但是,当命令错误时(例如,错误的用户名和密码组合作为参数给出),错误消息不会被重定向到错误文件。运行此脚本时,我仍然在屏幕上看到错误消息。例如,错误消息表明我提供了错误的用户名和密码组合。

我做错了什么? 我想我应该在屏幕上看不到任何输出,因为我正在将 stdout 和 stderr 都重定向到文件。

【问题讨论】:

  • 这对我来说实际上很好用。我创建了 foo 但没有创建 bar,然后运行 ​​ls foo bar 1> data 2>> error 并得到了想要的结果。您使用的是哪个版本的 bash?

标签: bash redirect io-redirection


【解决方案1】:

也许程序没有写入stderr,而是直接打开/dev/tty 与用户通信?这种方法在密码交互方面相当常见:软件希望确保密码提示能够“通过”用户,尽管有任何重定向。

如果是这种情况,您需要使用伪终端技巧来安排输出以在文件中结束。

如果你没有软件的源码,可以使用 strace/truss 找出程序真正在做什么。

【讨论】:

  • 您能详细说明一下吗?
  • 您具体想知道什么?这个问题是一年多前提出的,所以也许你最好问一个新的、具体的问题。
  • 好的,看看有没有答案:stackoverflow.com/questions/4056075/…
【解决方案2】:

您的重定向命令错误。使用 bash,试试这个:

$ cat redir.c
#include <stdio.h>

int main(void) {
        fprintf(stdout, "Hello stdout\n");
        fprintf(stderr, "Hello stderr\n");
}
$ ./redir > txt 2>&1
$ cat txt
Hello stderr
Hello stdout
$ 

'2>&1' 也是捕获标准错误的关键。

【讨论】:

  • 您的建议更清晰的版本:command &gt; datafile 2&gt;&amp;1 &gt;&gt; errorfile
  • @bcat:我的立场是正确的。我误读了这个问题——我通常希望 stdout 和 stderr 在同一个文件中,这就是我所展示的。这不是被问到的。哎呀。
  • @Jefromi:如果我按照您所说的去做,数据文件将一无所获。这就是为什么我改变了上面的命令(我的问题)。
  • @bLee:Martin v. Löwis 的回答听起来很有可能。我只是怀疑 2>> 速记(真的没有充分的理由)。
【解决方案3】:

您的标准错误重定向中似乎有一个额外的“>”。试试:

command 1> datafile 2> errorfile

编辑:正如 cmets 中所指出的,2>> 重定向标准错误,附加到文件,而 2> 覆盖文件。

我保留此答案以供参考。

【讨论】:

  • 好吧,它是为了“追加”。如果我有 >,那么每次都会创建新的错误文件。
  • @bLee:Doh!你是对的。这就是我在离开办公室时得到的回答。将编辑。
猜你喜欢
  • 2014-10-08
  • 1970-01-01
  • 2018-05-04
  • 2013-04-04
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多