我想将整个管道的 STDOUT 和 STDERR 重定向到/dev/null
.
考虑到这是我的命令:
sudo lsof -i:22000 -t | xargs kill -9
我知道这是错误的做法:
sudo lsof -i:22000 -t | xargs kill -9 >/dev/null 2>&1
>/dev/null 2>&1
由于简单的添加不会对管道产生任何影响,因为它将被解释为 STDIN 的一部分,我们如何才能实现这一点xargs kill -9
?
答案1
管道的输出
sudo lsof -i:22000 -t | xargs kill -9 >/dev/null 2>&1
未完全重定向到,/dev/null
因为最后的重定向仅影响命令,正如您所指出的,留下连接到终端xargs
的标准错误流。sudo
然而,从技术上讲,重定向并不是 的“标准输入的一部分” xargs
。的标准输入xargs
来自sudo
管道左侧的命令。
您需要将整个管道重定向:
{ your pipeline; } >/dev/null 2>&1
IE,
{ sudo lsof -i:22000 -t | xargs kill -9; } >/dev/null 2>&1
或者,您显然可以单独重定向每个单独的部分。
根据这是一个您永远不会再使用的“once-liner”一次性命令,还是将进入系统关键维护脚本的一行代码,您可能需要制作管道的左侧以这种方式,它在正常操作情况下根本不产生诊断消息(因此不需要隐藏其错误消息)。或者,您可能希望通过 systemd 或某些等效的服务框架来管理在端口 22000 上运行的服务。
切向相关: