Bash 运算符 < 、 > 、 | 和 grep / kill

Bash 运算符 < 、 > 、 | 和 grep / kill

作为一项练习,我想使用基本的 bash 原理通过命令行终止一个进程,但我遇到了一些我不明白的错误:

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' | kill

1)它不起作用

如果我尝试

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' > kill

2)也不起作用

3)如果我这样做, (..) egrep '\d' (...)这不应该与[0-9]相同吗?

4)有什么办法可以做这样的事情吗:

kill < (greps (...) )

答案1

尝试

kill `ps -A | grep nautilus | egrep -o '[0-9]{4,5}'`

反引号内的命令将被执行并作为命令的一部分输入。

答案2

  1. 操作|符将左侧的“标准输出”(stdout) 馈送到右侧的“标准输入”;标准输入或 stdin 相当于“如果用户输入,我将从用户那里读取的内容”。该kill(1)命令会终止其命令行上提供的进程 ID,而不是其 stdin 上提供的进程 ID。因此,xargs在前面插入kill会有所帮助:

    ... | xargs kill
    

    因为xargs(1)采用其标准输入并将其分批成块,以便使用由这些块组成的命令行重复调用所提供的命令(此处为“kill”)。

  2. >操作符用于将 stdout 重定向到文件,因此您在当前目录中创建了一个新文件,其文件名为“kill”并包含 pid 的内容。

  3. 该模式\d不是“标准”或“扩展”正则表达式语言的一部分;相反,它是由 Perl 引入的(我相信),并且存在于正则表达式语言的许多后续变体中。PCRE(Perl 兼容正则表达式)提供了一个库,该库有助于将扩展语法传播到许多其他工具和语言,但肯定不是当今唯一的实现。有些网站会为您提供不同正则表达式语言的矩阵比较。

    PCRE 附带的功能pcregrep(1)可以\d帮助您理解;此外,现代 GNU grep 还有一个-P选项,可以使用 PCRE 来进行正则表达式。

  4. 您在这里看到的是“命令替换”的概念,其中命令的标准输出直接在命令行中使用;现代语法是$(...),虽然您还会看到使用反引号,但这是历史性的并且嵌套不好。所以:

    kill $(ps ... | pcregrep ... | munge)
    

答案3

如果您知道可执行文件的名称,最好用它pidof来查找正在运行的程序的 pid。

答案4

大多数Linux都有杀伤力(和pgrep)可以实现您想要的功能。

pkill nautilus

相关内容