stdout/stderr 和 /dev/null 的令人困惑的行为

stdout/stderr 和 /dev/null 的令人困惑的行为

我试图理解这样的命令

[command] > /dev/null 2>&1

如果我理解正确的话,命令的输出将被重定向到/dev/null,然后stderr(文件描述符 2)被重定向到stdout(文件描述符 1)

最终结果是,[command]只会输出错误

为了理解这一点,我执行了以下命令:

bash-3.2$ echo "Hello World" 1>&2
Hello World

在这里,我回显“Hello World”并将其重定向到stderr.现在我运行以下命令:

bash-3.2$ echo "Hello World" 1>&2 2>&1
Hello World

我正在将stderr其重定向到stdout.正如预期的那样,它打印了Hello World

现在我运行这个

bash-3.2$ echo "Hello World" 1>&2 1>&1
Hello World

我想做的是打印输出stdout。但是,自从stdout我将其重定向到stderr.

那么为什么要打印呢Hello World?我原以为它不会打印任何内容。

答案1

echo "Hello World" 1>&2 1>&1

将文件描述符 1(标准输出)重定向到文件描述符 2(标准错误)所指向的任何位置,然后将文件描述符 1 重定向到其自身。因此,所有输出都会进入标准错误,但您没有更改它 - 所以所有输出都会进入您当前的终端。

要不打印任何内容,您需要重定向标准错误:

(echo "Hello World" 1>&2 1>&1) 2> /dev/null

或同等地,

echo "Hello World" 2>/dev/null 1>&2

你的解读

[command] > /dev/null 2>&1

不准确:> /dev/null将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出当前指向的内容/dev/null。所以所有的输出都被丢弃。

shell 的控制和重定向运算符是什么?了解详情。

相关内容