为什么某些Linux程序的输出既不输出到STDOUT也不输出到STDERR?
实际上,我想知道如何可靠地捕获所有程序输出,无论它使用什么“流”。我的问题是某些程序似乎不让其输出被捕获。
一个示例是“时间”命令:
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
要么
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
为什么两次都看到输出?我希望所有这些都可以通过管道传递到/ dev / null。
时间使用什么输出流,如何将其输出到文件中?
解决该问题的一种方法是创建一个Bash脚本,例如,combine.sh
包含以下命令:
$@ 2>&1
然后可以以正确的方式捕获“时间”的输出:
combine.sh time sleep 1 &> /dev/null
(看不到输出-正确)
有没有不使用单独的组合脚本即可实现我想要的方法的方法?
2>&1 > /dev/null
指“2现在去到1变为(即终端,默认情况下),然后1现在去到/ dev / null的(但2还是到终端!)的使用。>/dev/null 2>&1
说“ 1现在到达/ dev / null,然后2到达1所在的位置(即,也到达/ dev / null)。由于内置的“时间”不会被重定向,因此它在这里仍然无法正常工作,但通常更正确(例如,如果您使用/ usr / bin / time,它将可以工作)。将“ 2>&1”考虑为将1的“方向”复制为2,而不是将2复制为1