GNU kill(1) 接受名称参数多久了?

koj*_*iro 2 kill

我们最近发现 GNU kill 超越了spec将一个名称作为其参数,并尝试以与pkill(1) 或 killall 的某些实现相同的方式杀死所有具有该名称的进程

我一直没能找到 GNU 的 kill 更新日志。这个“功能”是什么时候添加的?

Gil*_*il' 8

您可以在 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)

您链接到联机帮助页适用killutil-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)