BASH:错误消息未重定向到文件

BASH:错误消息未重定向到文件,bash,redirect,io-redirection,Bash,Redirect,Io Redirection,我有一个bash脚本,它只调用不同的调用,并将stdout和stderr输出重定向到不同的文件 我已经做到了: command 1> datafile 2>> errorfile 但是,当命令错误时(例如,作为参数给出的用户名和密码组合错误),错误消息不会重定向到errorfile。当我运行此脚本时,仍会在屏幕上看到错误消息。例如,错误消息表明我提供了错误的用户名和密码组合 我做错了什么? 我想我应该在屏幕上看不到输出,因为我正在将stdout和stderr重定向到文件。也许

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

我已经做到了:

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

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

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

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


如果您没有该软件的源代码,可以使用strace/truss来了解该程序的真正功能。

您的重定向命令错误。使用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
$ 
$cat redir.c
#包括
内部主(空){
fprintf(stdout,“Hello stdout\n”);
fprintf(stderr,“Hello stderr\n”);
}
$./redir>txt 2>&1
$cat txt
你好,斯特德
你好,斯图
$ 

“2>&1”是捕获stderr的关键。

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

command 1> datafile 2> errorfile
编辑:正如评论中指出的,2>>重定向stderr,将其附加到文件,而2>覆盖文件


我保留这个答案以供参考。

这对我来说确实很好。我创建了foo而不是bar,然后运行
ls foo bar 1>数据2>>error
,得到了所需的结果。您使用的是什么版本的bash?您的建议的更清晰版本:
command>datafile 2>&1>>errorfile
@bcat:我接受更正。我看错了问题——我通常希望stdout和stderr在同一个文件中,这就是我所展示的。这不是我们所问的。噢。@Jefromi:如果我照你说的做,数据文件什么也得不到。这就是为什么我改变了上面的命令(我的问题)。@bLee:martinv。Löwis的回答听起来很有可能。我只是怀疑2>>的速记(真的没有什么好的理由)。好吧,它是指“附加”。如果我有>,那么每次都会创建新的错误文件。@bLee:Doh!你说得对。这就是我在离开办公室的路上回答问题所得到的。将进行编辑。你能详细说明一下吗?你具体想知道什么?这个问题是一年多前提出的,所以你最好问一个新的、具体的问题。好的,请看看你是否有答案: