未在Bash中执行/ bin / kill

时间:2018-09-25 13:45:20

标签: bash shell sh exec

我正在迁移仅使用sh进行重击的脚本,该脚本最初看起来像这样:

 #!/bin/sh
 ... a bunch of setup ...
 exec "$@"

当我通过以下方式运行脚本时:

./my_script kill -l

我得到了可用信号的列表:

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

但是,我想使用bash信号名称,所以我想我可以简单地做到:

#!/bin/bash

exec bash -l "$@"

问题是现在无法识别杀死:

/bin/kill: /bin/kill: cannot execute binary file

真的,我的脚本只是另一个过程的包装,我需要确保可以向其发送kill -SIGTERM信号。

2 个答案:

答案 0 :(得分:2)

您需要添加-c选项。否则(请参见bash手册页的ARGUMENTS部分)“……第一个参数假定为包含外壳命令的文件的名称。”

即:

exec bash -lc "$*"

答案 1 :(得分:1)

您要告诉bash运行一个文件,该文件应该是bash脚本,但实际上是二进制可执行文件。

代替此:

#!/bin/bash

exec bash -l "$@"

使用此:

#!/bin/bash

exec bash -c "$1"

是否有特定原因需要使用选项-l来将bash作为“登录” shell运行?如果不是,则仅使用选项-c运行字符串参数。

已更新为使用$1而不是$@,因为它更适合@chepner注释的字符串参数。

这还要求您将参数作为字符串发送,而不是对二进制文件的引用。

代替此:

./my_script kill -l

执行以下操作:

./my_script "kill -l"