在尝试发送时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
生成的行标记(在系统头文件中定义的宏扩展之前添加的行),混淆了gcc
cpp
# lnum_of_definition "header.h" 3 4
signames2.awk
用于生成信号和数字列表的脚本。请注意,他们没有修复该脚本,而是只是通过-P
最新cpp
版本的zsh
.
看这里。感谢@Stéphane Chazelas 的提示——我看过这些awk
脚本,但我缺乏天赋,所以我不认为它们是罪魁祸首,因为它们多年来没有改变。