我试图理解这样的命令
[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 的控制和重定向运算符是什么?了解详情。