为什么管道运算符的这种用法不起作用?

mem*_*eme 0 bash pipe

我通常pidof用来获取进程的 pid 并KILL -SIGTERM <pid>终止它。

管道应该将一个命令的输出作为另一个命令的输入。

那么为什么下面的命令不起作用呢?

pidof firefox | kill -SIGTERM
Run Code Online (Sandbox Code Playgroud)

Chr*_*own 6

管道应该将一个命令的输出作为另一个命令的输入。

这是正确的,但kill不会对标准输入进行任何输入。相反,您需要将其作为命令行参数提供:

kill -SIGTERM "$(pidof firefox)"
Run Code Online (Sandbox Code Playgroud)

或者:

pidof firefox | xargs kill
Run Code Online (Sandbox Code Playgroud)

$(是 shell 内的命令扩展,而是xargs外部的。

然而,这些方法有许多极端情况,比如如果有多个 pid 该怎么办,没有 pid 等等——这就是 pkill 存在的原因:

pkill -TERM firefox
Run Code Online (Sandbox Code Playgroud)