“kill -l”仅返回 ZERR

“kill -l”仅返回 ZERR

在尝试发送时SIGQUIT我得到了这个:

$ kill -s QUIT 4341      
kill: unknown signal: SIGQUIT
kill: type kill -l for a list of signals

我很惊讶地看到这一点:

$ kill -l
ZERR

所以,不知何故kill不知道所有信号名称。这是 Ubuntu 的巧妙之处(是的,是时候升级它了,但这是另一个问题)

显然我SIGQUIT只是使用数字发送的3,但是,什么会导致kill忘记信号名称呢?

UPD:这是 zsh。

$ type kill     
kill is a shell builtin                
$ echo $ZSH_VERSION $ZSH_PATCHLEVEL                                                             
5.0.2 1.5778                           

我验证了它/bin/kill工作正常,所以一定是 zsh 特定的东西..

答案1

这一定是您的 zsh 可执行文件的构建方式存在问题。信号列表是在编译时由操作系统确定的。 “假信号”ZERR表示由于错误而不是信号而退出,被添加到列表的末尾。在您的构建中,不知何故,来自操作系统的信号列表是空的。

Stéphane Chazelas 确定了可能的罪魁祸首,这是一个现在修复了构建脚本与最新版本的 GCC 编译器的不兼容性。如果您只是构建更新版本的 zsh,问题应该可以解决。但请注意,Ubuntu artful 附带了 zsh 5.2,它比您的版本更新。就连之前长期支持的 Ubuntu 版本也有 5.1.1。因此,没有理由保留您自己的版本,除非您需要这个旧版本进行兼容性测试。如果您绝对需要保留此旧版本,请使用旧版本的 GCC 构建它。

答案2

您的 shell 几乎可以肯定是zsh,并且您可能已kill定义为别名或函数(使用 进行检查type kill)。

但我仍然无法重现你的情况:

zsh$ kill -l 30
PWR
zsh$ kill -l 31
SYS
zsh$ kill -l 32
32
zsh$ kill -l -96
32

32"ZERR"是 的信号名称表中的索引zsh,但是,正如所见,(至少在我的系统上)它被正确地限制到最大信号编号 ( 31)。

zsh请使用您的( echo $ZSH_VERSION $ZSH_PATCHLEVEL) 和操作系统 ( )的版本更新您的问题uname -a。我想这是在分发端口中溃烂的那些坏补丁之一(未经上游开发人员审查的快速“修复”)。

更新:

尝试zsh从 artful 安装包存储库(版本 5.2.5)或从源代码重新编译最新版本zsh

这个问题实际上是由旧版本中的错误引起的——由/zsh生成的行标记(在系统头文件中定义的宏扩展之前添加的行),混淆了gcccpp# lnum_of_definition "header.h" 3 4signames2.awk用于生成信号和数字列表的脚本。请注意,他们没有修复该脚本,而是只是通过-P最新cpp版本的zsh.

这里。感谢@Stéphane Chazelas 的提示——我看过这些awk脚本,但我缺乏天赋,所以我不认为它们是罪魁祸首,因为它们多年来没有改变。

相关内容