为什么此命令适用于记录脚本输出?

为什么此命令适用于记录脚本输出?

此命令不会将我的脚本的输出存储在日志文件中:

. myscript.sh | tee -a log_file.log

然而下一个命令将输出存储在日志文件中。

. myscript.sh 2>&1 | tee -a dash_log.log

为什么第二个有效而第一个无效? AFAIK 唯一的区别是我已经告诉 bash 将 stderr 重定向到 stdout,并且它不应该对 stdout 发生的情况产生任何影响。然而,第一个命令甚至不会将标准输出的“无错误”版本存储在日志文件中。

如果重要的话:我使用的是 AWS 上托管的 Ubuntu 12.04

编辑:这是由于对 wget 如何输出消息的错误假设造成的。看https://stackoverflow.com/questions/13066518/why-does-wget-output-to-stderr-rather-than-stdouthttp://www.gnu.org/software/wget/manual/html_node/Logging-and-Input-File-Options.html

答案1

您的脚本似乎正在将大部分或全部输出写入 stderr。这很容易测试

myscript.sh > std.out
myscript.sh 2> err.out

然后查看每个文件的内容并接受教育。


我对此表示怀疑 - 脚本的唯一输出来自对 wget 的调用

不要怀疑,这很容易测试

$ wget http://serverfault.com >std.out
--2013-09-09 07:06:25--  http://serverfault.com/
Resolving serverfault.com... 198.252.206.16
Connecting to serverfault.com|198.252.206.16|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 51867 (51K) [text/html]
Saving to: “index.html.6”

100%[=================================================>] 51,867   231K/s  in 0.2s

2013-09-09 07:06:26 (231 KB/s) - “index.html.6” saved [51867/51867]

看,输出仍然被写入终端,然后尝试

 $ wget http://serverfault.com 2>err.out
 $

量子电动力学

wget 命令将其输出写入 stderr 而不是 stdout。

答案2

可能需要查看代码,但这可能是由于您的代码写入了 stderr。

相关内容