如何将管道的输出重定向到 >/dev/null

Nas*_*rka 2 shell pipe io-redirection

我想将整个管道的 STDOUT 和 STDERR 重定向到/dev/null.

考虑到这是我的命令:

sudo lsof -i:22000 -t | xargs kill -9
Run Code Online (Sandbox Code Playgroud)

我知道这是错误的做法:

sudo lsof -i:22000 -t | xargs kill -9 >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

我们如何实现这一点,因为简单地添加>/dev/null 2>&1不会对管道产生任何影响,因为它将被解释为xargs kill -9?

Kus*_*nda 10

管道的输出

sudo lsof -i:22000 -t | xargs kill -9 >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

没有完全重定向到,/dev/null因为最后的重定向只影响xargs命令,正如您所指出的,将标准错误流连sudo接到终端。然而,从技术上讲,重定向不是xargs. 的标准输入xargs来自sudo管道左侧的命令。

您需要将管道作为一个整体重定向:

{ your pipeline; } >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

IE,

{ sudo lsof -i:22000 -t | xargs kill -9; } >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

或者,您显然可以单独重定向每个单独的部分。

根据这是一个永远不会再使用的“一次性”一次性命令,还是将进入系统关键维护脚本的一行代码,您可能想要制作管道的左侧以这样的方式,它在正常操作环境下根本不会产生诊断消息(因此不需要隐藏其错误消息)。或者,您可能希望通过 systemd 或某些等效的服务框架来管理在端口 22000 上运行的服务。

切线相关: