为什么 nginx 的重定向输出不起作用?

Max*_*kyi 2 output pipe

我想按行列出nginx服务器的所有模块,因此我输入以下内容:

nginx -V | tr -- - '\n'
Run Code Online (Sandbox Code Playgroud)

但它不会将模块排成一行。如果我这样做:

2>&1 nginx -V | tr -- - '\n'
Run Code Online (Sandbox Code Playgroud)

有用。但为什么?

ste*_*ver 5

您所观察到的内容表明将nginx -V其输出写入标准错误流(又名stderr- 文件描述符2)而不是标准输出流(又名stdout- 文件描述符1)。只stdout通过管道传递|,因此您的tr命令不会收到它。

2>&1语法告诉 shell 重定向stderr到,stdout以便随后通过管道传输到tr。仅供参考,您使用的位置在语法上是合法的,但非常规 - 大多数情况下,这种重定向会写成

nginx -V 2>&1 | tr -- - '\n'
Run Code Online (Sandbox Code Playgroud)

顺便说一句,管道|实际上是重定向第一个命令的输出,而不是第二个命令的输入,第二个命令像往常一样来自标准输入流(stdin- 文件描述符)。0