代码之家  ›  专栏  ›  技术社区  ›  Anthony

在Bash/bin/kill中找不到Exec

  •  0
  • Anthony  · 技术社区  · 6 年前

    我正在迁移一个只使用sh来bash的脚本,该脚本最初是这样的:

     #!/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 "$@"
    

    现在的问题是无法识别kill:

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

    实际上,我的脚本只是另一个进程的包装器,我需要确保 kill -SIGTERM 可以发送给它。

    2 回复  |  直到 6 年前
        1
  •  1
  •   virullius    6 年前

    您告诉bash运行一个文件,它希望该文件是bash脚本,但结果却是一个二进制可执行文件。

    而不是这样:

    #!/bin/bash
    
    exec bash -l "$@"
    

    使用此选项:

    #!/bin/bash
    
    exec bash -c "$1"
    

    你需要选择的具体原因是什么 -l -c 运行字符串参数。

    已更新以使用 $1 $@ 因为它更适合于@chepner评论的字符串参数。

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

    而不是这样:

    ./my_script kill -l
    

    请执行以下操作:

    ./my_script "kill -l"
    
        2
  •  2
  •   borrible    6 年前

    你需要添加 -c 选项。否则(请参阅 bash “手册页)”…第一个参数假定为包含shell命令的文件名

    exec bash -lc "$*"