我可以将 pgrep 与 kill 链接起来吗?

Tom*_*ica 40 shell pipe arguments

我注意到它|用于将第一个命令的结果发送给另一个。我想杀死所有与名称匹配的进程。
这是 pgrep 通常所做的:

$ pgrep name
5089
5105
Run Code Online (Sandbox Code Playgroud)

并且多个参数似乎适用于kill

sudo kill 5089 5105
Run Code Online (Sandbox Code Playgroud)

但这是错误的:

pgrep name | kill
Run Code Online (Sandbox Code Playgroud)

那么如何正确操作呢?

cuo*_*glm 55

尝试这个:

pgrep name | xargs kill
Run Code Online (Sandbox Code Playgroud)

如果您使用pgrep name | kill,则 的输出将pgrep name馈送到 的标准输入kill。因为kill不从 stdin 读取参数,所以这行不通。

使用xargs,它将kill从标准输入构建参数。例子:

$ pgrep bash | xargs echo
5514 22298 23079
Run Code Online (Sandbox Code Playgroud)

  • 与空格和换行符无关。仅仅是因为 kill 不读取 stdin 上的参数。 (5认同)

小智 28

这应该有效:

pkill name
Run Code Online (Sandbox Code Playgroud)

我还建议阅读手册页。


Mik*_*kel 8

回答一般而不是具体...

管道用于将一个程序的输出作为输入传递给另一个程序。

看起来您正在尝试将一个程序的输出用作另一个程序的命令行参数,这是不同的。

为此,请使用命令替换

例如,如果你想运行

sudo kill 5089 5105
Run Code Online (Sandbox Code Playgroud)

你有一个pgrep name输出命令5089 5105

你把它们放在一起就像

sudo kill $(pgrep name)
Run Code Online (Sandbox Code Playgroud)