如何将stderr和stdout重定向到脚本同一行中的不同文件?


179

我很了解:

$ command 2>> error

$ command 1>> output

有什么办法可以将stderr输出到错误文件,并在bash的同一行中将stdout输出到输出文件?

Answers:


292

只需将它们添加到一行中 command 2>> error 1>> output

但是,请注意,>>如果文件已经有数据,则用于追加。而>将覆盖文件中的所有现有数据。

因此,command 2> error 1> output如果您不想附加。

只是为了完整起见,您可以1>>默认文件描述符是输出那样编写。因此1>>是同一回事。

因此,command 2> error 1> output成为command 2> error > output


3
好答案!我真的很喜欢您的解释如何1>写为>
user784637 2011年

这与like有command &2>err.log什么不同,我认为我完全混淆了语法。(可能会正确链接所有bash管道行为的适当答案)
ThorSummoner 2015年

4
我认为您正在寻找@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html。Fwiw,看起来command &2>err.log不太合法-语法中的&符用于文件描述符作为目标,例如command 1>&2将stdout重新路由到stderr。
DreadPirateShawn

@DreadPirateShawn,请不要链接ABS作为参考-它有时包含完全不正确的地方,并且经常包含不良做法的示例。wiki.bash-hackers.org/howto/redirection_tutorial是一个在重定向更好的参考来源。
Charles Duffy

27

试试这个:

your_command 2>stderr.log 1>stdout.log

更多信息

该数字0经过9文件描述符在bash。 0代表标准输入,1代表标准输出,2代表标准误差。39其他任何临时用途都可以使用。

可以使用运算符将​​任何文件描述符重定向到一个文件或另一个文件描述符>。您可以改为使用运算符>>将其追加到文件中,而不用创建一个空文件。

用法:

file_descriptor > filename

file_descriptor > &file_descriptor

请参考《高级Bash脚本指南》:第20章


一小时Thanks.i搜索这
DILOsürücü


9

或者,如果您希望将输出(stdout和stderr)混合在一个文件中,则可以使用:

command > merged-output.txt 2>&1

32
这不是问题的答案。
Matthias 2015年

人们为什么要合并输出或建议合并输出?
nurettin

@nurettin:也许您有一个脚本行,该脚本行仅执行命令并立即将输出保存到日志文件。有问题的命令有时可能会失败,因此您也希望将与此有关的任何错误保存到同一日志文件中。
streamofstars

@streamofstars是的,当然,您有时是对的,也许这正是人们想要的。我在这个问题的背景下发表评论,当时有人正在寻找答案,并且在stackoverflow上发现了许多不相关的答案。
nurettin

0

多个命令的输出可以重定向。这适用于命令行或在bash脚本中最有用。该-s指示密码提示屏幕。

Hereblock cmd stdout / stderr发送到单独的文件,没有任何显示。

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmd stdout / stderr发送到单个文件并显示。

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Hereblock cmd stdout / stderr被发送到单独的文件中,并以stdout显示。

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

根据您是谁(whoami)和用户名,可能需要也可能不需要密码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.