作为一项练习,我想使用基本的 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
操作
|
符将左侧的“标准输出”(stdout) 馈送到右侧的“标准输入”;标准输入或 stdin 相当于“如果用户输入,我将从用户那里读取的内容”。该kill(1)
命令会终止其命令行上提供的进程 ID,而不是其 stdin 上提供的进程 ID。因此,xargs
在前面插入kill
会有所帮助:... | xargs kill
因为
xargs(1)
采用其标准输入并将其分批成块,以便使用由这些块组成的命令行重复调用所提供的命令(此处为“kill”)。该
>
操作符用于将 stdout 重定向到文件,因此您在当前目录中创建了一个新文件,其文件名为“kill”并包含 pid 的内容。该模式
\d
不是“标准”或“扩展”正则表达式语言的一部分;相反,它是由 Perl 引入的(我相信),并且存在于正则表达式语言的许多后续变体中。PCRE(Perl 兼容正则表达式)提供了一个库,该库有助于将扩展语法传播到许多其他工具和语言,但肯定不是当今唯一的实现。有些网站会为您提供不同正则表达式语言的矩阵比较。PCRE 附带的功能
pcregrep(1)
可以\d
帮助您理解;此外,现代 GNU grep 还有一个-P
选项,可以使用 PCRE 来进行正则表达式。您在这里看到的是“命令替换”的概念,其中命令的标准输出直接在命令行中使用;现代语法是
$(...)
,虽然您还会看到使用反引号,但这是历史性的并且嵌套不好。所以:kill $(ps ... | pcregrep ... | munge)
答案3
如果您知道可执行文件的名称,最好用它pidof
来查找正在运行的程序的 pid。
答案4
大多数Linux都有杀伤力(和pgrep
)可以实现您想要的功能。
pkill nautilus