防止命令将 stdout 和 stderr 发送到任何终端或文件

防止命令将 stdout 和 stderr 发送到任何终端或文件

我想阻止我的程序将 stdout 和 stderr 发送到任何终端、文件或设备。为此,我脑子里闪过三个命令,但我无法区分它们的区别。请您向我解释一下它们各自的含义好吗?

# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1

答案1

# ./run > /dev/null

这会将 stdout 重定向到/dev/null,但它对 stderr 根本不执行任何操作。由于您要求从 stdout 和 stderr 重定向,因此这不会执行您想要的操作。

# ./run > /dev/null 1>&2

这将 stdout 重定向到/dev/null,然后再次将 stdout 重定向 ( 1>) 到 stderr 指向 ( &2) 的任何地方,这可能是终端,并且可能是 stdout 在重定向之前指向的位置。因此,这里的最终效果(可能)是 stdout 根本没有重定向,而对于 stderr,您仍然不对其执行任何操作。所以这也不是你想要的。

# ./run > /dev/null 2>&1

这会将 stdout 重定向到/dev/null,然后将 stderr ( 2>) 重定向到 stdout 指向的任何位置,这是/dev/null因为那是您刚刚将其重定向的位置。这似乎就是你想要的。

我无法区分他们的差异。

实际上,您应该能够很容易地区分这些差异。假设./run包含这个:

#!/bin/sh
echo stdout
echo stderr >&2

那么结果应该如下:

# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1

区别很明显!

相关内容