![“command.sh > /dev/null 2>&1” 和 “command.sh 2>&1 >/dev/null” 之间有什么区别](https://linux22.com/image/772083/%E2%80%9Ccommand.sh%20%3E%20%2Fdev%2Fnull%202%3E%261%E2%80%9D%20%E5%92%8C%20%E2%80%9Ccommand.sh%202%3E%261%20%3E%2Fdev%2Fnull%E2%80%9D%20%E4%B9%8B%E9%97%B4%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB.png)
我的 crontab 上有许多 shell 和 python 脚本,它们以以下形式结尾:
command.sh > /dev/null 2>&1
或者
command.sh 2>&1 >/dev/null
我知道:
>
用于重定向
/dev/null
是一个黑洞,任何发送的数据都将被丢弃
2
是标准错误的文件描述符
>
用于重定向
&
是文件描述符的符号(如果没有它,后面的 1 将被视为文件名)
1
是标准输出的文件描述符
因此command.sh >/dev/null 2>&1
将程序的输出重定向到 /dev/null。包括标准错误和标准输出。
两者都具有相同的结果并且工作正常,但是为什么有些人使用第一种类型而有些人使用另一种类型?
答案1
这些命令正在执行两次重定向:
> /dev/null
重定向标准输出到/dev/null
2>&1
将标准错误重定向到标准输出
正如您正确猜测的那样,全局效果是标准输出和标准错误都被重定向到/dev/null
。
这两个重定向都旨在由 shell 而不是实际调用的程序进行解释;因此它们被附加到命令行的末尾。它们在逻辑上是不同的,尽管它们的效果是累积的;因此它们可以按您喜欢的任何顺序指定。
总结:这两个命令完全等效,区别纯粹是外观上的。