我的 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。包括标准错误和标准输出。
两者都有相同的结果并且工作正常,但是为什么有些人使用第一种类型而有些人使用另一种呢?
这些命令正在执行两个重定向:
> /dev/null
将标准输出重定向到/dev/null
2>&1
将标准错误重定向到标准输出正如您猜对的那样,全局效果是标准输出和标准错误都被重定向到
/dev/null
.这两个重定向都意味着由 shell 解释,而不是由实际调用的程序解释;因此它们被附加到命令行的末尾。尽管它们的影响是累积的,但它们在逻辑上是不同的;因此可以按您喜欢的任何顺序指定它们。
TL;DR:这两个命令是完全等价的,区别纯粹是装饰性的。