Exec в Bash / bin / kill не найден - PullRequest
       13

Exec в Bash / bin / kill не найден

0 голосов
/ 25 сентября 2018

Я переношу скрипт, который просто использовал 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 "$@"

Проблема теперь в уничтожении не распознана:

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

На самом деле мой сценарий является просто оберткой вокруг другого процесса, и мне нужно убедиться, что ему может быть отправлен сигнал kill -SIGTERM.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы говорите bash запустить файл, который, как ожидается, будет сценарием bash, но оказывается двоичным исполняемым файлом.

Вместо этого:

#!/bin/bash

exec bash -l "$@"

Использоватьthis:

#!/bin/bash

exec bash -c "$1"

Есть ли конкретная причина, по которой вам нужен параметр -l для запуска bash в качестве оболочки для входа в систему?Если нет, просто используйте параметр -c для запуска строкового аргумента.

Обновлен для использования $1 вместо $@, так как он более подходит для строкового аргумента, как прокомментировал @chepner.

Для этого также необходимо отправить аргумент в виде строки, а не ссылку на двоичный файл.

Вместо этого:

./my_script kill -l

Сделайте это:

./my_script "kill -l"
0 голосов
/ 25 сентября 2018

Вам необходимо добавить опцию -c.В противном случае (см. Раздел «АРГУМЕНТЫ» справочной страницы bash) «... первый аргумент предполагается как имя файла, содержащего команды оболочки.» *

Т.е.:

exec bash -lc "$*"
...