我们最近发现 GNU kill 超越了spec,将一个名称作为其参数,并尝试以与pkill(1) 或 killall 的某些实现相同的方式杀死所有具有该名称的进程。
我一直没能找到 GNU 的 kill 更新日志。这个“功能”是什么时候添加的?
您可以在 Savannah 上浏览Gnu coreutils的源代码(或在您的机器上克隆存储库),特别是查看该实用程序的源代码和更改日志kill
。没有也从来没有这样的功能。
do {
intmax_t n = (errno = 0, strtoimax (arg, &endp, 10));
…
if (errno == ERANGE || pid != n || arg == endp || *endp)
{
error (0, 0, _("%s: invalid process id"), arg);
status = EXIT_FAILURE;
}
…
} while ((arg = *++argv));
Run Code Online (Sandbox Code Playgroud)
您链接到的联机帮助页适用kill
于util-linux 集合中的命令。从手册页的日期可以看出,此功能非常古老。许多 Linux 系统都提供kill
来自 GNU coreutils的命令,或者来自procps包的命令,而且大多数情况下,您会看到 shell 的内置命令,而不是外部命令。这些都不允许您将裸命令名称作为参数传递。
在相关说明中,在 bash、ksh 和 zsh 中,您可以将任何作业规范作为参数传递给kill
. 作业规范以 a 开头,%
后跟作业编号或该作业的命令名称的一部分。
$ jobs
[3] + Running sleep 9999 &
[2] - Stopped vim foo
[1] Running xterm &
$ kill %sleep
[3] + Terminated sleep 9999 &
$ jobs
[2] + Stopped vim foo
[1] - Running xterm &
Run Code Online (Sandbox Code Playgroud)