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

Sam*_*man 7 command-line bash shell-script

我想阻止我的程序将 stdout 和 stderr 发送到任何终端、文件或设备。为此,我想到了三个命令,但我无法区分它们的区别。请你向我解释一下它们每个的含义。

# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

Cel*_*ada 15

# ./run > /dev/null
Run Code Online (Sandbox Code Playgroud)

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

# ./run > /dev/null 1>&2
Run Code Online (Sandbox Code Playgroud)

这将 stdout 重定向到/dev/null,然后它再次将 stdout ( 1>)重定向到 stderr 指向( ) 的任何地方&2,这可能是终端,并且可能是 stdout 在重定向之前指向的地方。所以这里的净效果(可能)对于标准输出根本没有重定向,至于标准错误,你仍然没有对它做任何事情。所以这也不是你想要的。

# ./run > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

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

我无法区分他们的差异。

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

#!/bin/sh
echo stdout
echo stderr >&2
Run Code Online (Sandbox Code Playgroud)

那么结果应该如下:

# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

区别一目了然!