2

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

我已经这样做了:

command 1> datafile 2>> errorfile

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

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

4

3 回答 3

6

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

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

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

于 2009-08-27T20:07:51.267 回答
-1

您的重定向命令是错误的。使用 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' 也是捕获标准错误的关键。

于 2009-08-27T20:08:02.497 回答
-2

看起来您的 stderr 重定向中有一个额外的“>”。尝试:

command 1> datafile 2> errorfile

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

我保留此答案以供参考。

于 2009-08-27T20:21:07.590 回答