“command.sh > /dev/null 2>&1” 和 “command.sh 2>&1 >/dev/null” 之间有什么区别

“command.sh > /dev/null 2>&1” 和 “command.sh 2>&1 >/dev/null” 之间有什么区别

我的 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 而不是实际调用的程序进行解释;因此它们被附加到命令行的末尾。它们在逻辑上是不同的,尽管它们的效果是累积的;因此它们可以按您喜欢的任何顺序指定。

总结:这两个命令完全等效,区别纯粹是外观上的。

相关内容