我正在尝试执行以下命令,其中使用了 Kill 和 exec 命令。
kill -l -exec grep -i 'term' {} +
因为,kill -l 返回所有终止信号的列表,所以我想使用带有不区分大小写的 -i 标志的 grep 查找包含单词“term”的所有信号。但是,它返回以下错误。有人可以建议为什么会这样吗?
-bash: kill: grep: invalid signal specification
-bash: kill: -i: invalid signal specification
15
-bash: kill: {}: invalid signal specification
-bash: kill: +: invalid signal specification
答案1
-exec cmd {} +
find
是命令和单独命令的习语find
。它用于运行cmd
它所拥有的文件成立作为参数。-exec
有不是一个选项,通常称为谓词并且 用于构成表达式的条件和操作链find
(find
还支持在应该开始查找的文件/目录列表之前传递的选项)。
kill
是大多数 shell 中内置的命令,用于根据进程 ID 或它们所属的 shell 作业向进程发送信号。
大多数实现还支持一个-l
选项,该选项列出了可以以随实现而变化的格式发送的信号。有些每行列出一个信号,有些按列列出,有些只是用空格分隔,有些还包括信号名称和编号。
如果除了选项之外-l
,您还传递信号名称或数字(SIG
在某些实现中带有或不带有前缀),则某些kill
实现将输出相应的信号编号/名称,尽管有些实现始终打印名称,而有些实现仅接受数字。
所以:
kill -l TERM
例如,对于一些包括 shell内置函数在内的kill
实现,将输出:kill
zsh
15
15
在大多数(如果不是全部)系统上,SIGTERM 的实际值是在哪里。
在zsh
shell 中,信号名称(+ EXIT 也在 中使用trap
)也可以在$signals
特殊数组中使用:
$ echo $signals
EXIT HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS ZERR DEBUG
给定信号的信号编号是其在数组中的索引减 1。
$ echo $signals[15+1]
TERM
$ echo $(( signals[(I)TERM] - 1 ))
15
或者对于不区分大小写的匹配:
$ set -o extendedglob
$ echo $(( signals[(I)(#i)term] - 1 ))
15
(kill -l term
在许多实现中也有效kill
)。
答案2
使用该选项,当不处于 POSIX 模式时,的内置命令-l
的输出为:bash
kill
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE
9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG
17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD
21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGINFO 30) SIGUSR1 31) SIGUSR2
我可以将每一对number) signal
分组xargs -n 2
所以这应该满足您的要求:
kill -l | xargs -n 2 | grep -i term