bash - 为什么/bin/kill 的有效信号与 kill 不同?

标签 bash signals kill

我正在尝试编写一个快速的 bash 脚本,以在脚本检测到的特定条件下向程序发出信号,并且出于习惯,我正在使用某些 bin 实用程序的完整路径,即 /bin/rm /bin/kill 代替 rmkill。但是,特别是使用 kill 时,我注意到我可以发送的有效信号有所不同,这让我感到困惑:

[root@linux]# which kill
/bin/kill

[root@linux]# /bin/kill -l
HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT
STOP TSTP TTIN TTOU TRAP IOT BUS SYS STKFLT URG IO POLL CLD XCPU XFSZ
VTALRM PROF PWR WINCH UNUSED

[root@linux]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

我也没有 kill 的别名:

[root@linux]# alias 
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

显然,解决方法是只使用 kill,但是如果 which kill 解析为 /bin/kill,为什么它们会有所不同呢?

最佳答案

kill 是一个内置的 bash。不幸的是,bash 没有内置的 which(比如 zsh,它立即告诉我 kill 是一个内置的 shell 命令)和 /usr/bin/which 无法知道您的 shell 内置函数。 (我希望 bash 有一些等效的东西来快速检查命令是否是内置的。不过,成功的 help kill 足以用于交互式使用)。

正如@chepner 在评论中所解释的,type -a COMMAND 可用于获取 COMMAND 的可用变体列表:内置函数、别名、 PATH任何 目录中的函数和二进制文件:

$ type -a kill
kill is a shell builtin
kill is /bin/kill

关于bash - 为什么/bin/kill 的有效信号与 kill 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756247/

相关文章:

linux - 是否可以向 TSTP 发出信号,然后在发生超时时将其杀死

c - 在 C 中重定向输出时杀死并没有真正杀死

c - 单元测试kill命令

bash - bash 变量中的标记数

bash - 加入给出警告 "file1 is not in sorted order"

bash - 这个 youtube-dl 自动脚本有什么问题?

android - 我可以检测到我的服务何时被 "Advanced Task Killer"杀死吗

linux - 异步管道

c++ - QT 插槽和信号失败

linux - 在 Linux 中处理/dev/tty 设备上的用户中断(UART 中断)