将 -exec 与 Kill 命令一起使用

将 -exec 与 Kill 命令一起使用

我正在尝试执行以下命令,其中使用了 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不是一个选项,通常称为谓词并且 用于构成表达式的条件和操作链findfind还支持在应该开始查找的文件/目录列表之前传递的选项)。

kill是大多数 shell 中内置的命令,用于根据进程 ID 或它们所属的 shell 作业向进程发送信号。

大多数实现还支持一个-l选项,该选项列出了可以以随实现而变化的格式发送的信号。有些每行列出一个信号,有些按列列出,有些只是用空格分隔,有些还包括信号名称和编号。

如果除了选项之外-l,您还传递信号名称或数字(SIG在某些实现中带有或不带有前缀),则某些kill实现将输出相应的信号编号/名称,尽管有些实现始终打印名称,而有些实现仅接受数字。

所以:

kill -l TERM

例如,对于一些包括 shell内置函数在内的kill实现,将输出:killzsh

15

15在大多数(如果不是全部)系统上,SIGTERM 的实际值是在哪里。

zshshell 中,信号名称(+ 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的输出为:bashkill

$ 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

相关内容