为什么test > file
以1退出而test arg1 > arg2
以0退出?
我认为在test arg1 > arg2
中,首先应用test arg1
,然后将输出(没有输出)写入文件arg2
,并且由于最后一个命令(重定向)成功,所以退出是0。但是第一种情况也应该如此。我有点困惑。
答案 0 :(得分:2)
重定向不是命令。
|
创建一个新命令,因为不仅先前命令“ piped”的输出在其他位置,而且在该输出上执行了另一个命令。例如,
ls | grep 'abc'
将在没有任何匹配该模式的情况下退出1,而不管ls
是否成功完成)。您在$?
中看到的退出状态是最后一个管道的状态。
重定向是不一样的,因为重定向不会将输出传递给下一个命令,而不会传递给文件。请注意,重定向 可以使您在命令原本可以工作的情况下返回1,因为您没有写该文件的权限。在这种情况下,您的命令将不会执行。
TL; DR:命令需要有效的重定向才能运行。如果可以运行,则退出状态将是命令的退出状态。重定向的退出状态是命令的OR,并且重定向(0 OR 1、1 OR 1、1 OR 0都将返回1;仅成功的重定向和成功的命令将返回0)