trap exec код возврата в сценарии оболочки - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно запустить команду, используя exec в сценарии оболочки, и мне нужно перехватить код выхода в случае ошибки и выполнить другую команду, например,

#!/bin/sh
set +e
exec command_that_will_fail
if [ $? -eq 1 ]; then
    echo "command failed, running another command"
fi

Я понимаю, что exec заменяет текущую оболочку и продолжает работу, моя проблема в том, что мне нужно запустить другую команду, если exec не является успешным.

1 Ответ

0 голосов
/ 13 мая 2018

Ваш код работает, если при попытке запустить процесс возникает какая-то немедленная ошибка:

$ echo 1
1
$ echo $?
0
$ exec asd123
-bash: exec: asd123: not found
$ echo $?
127

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

Например, это никогда не возвращает:

$ exec grep asd /dev/null

(код выхода grep равен 1, но родительская оболочка перегружена, поэтому никто не может проверить)

Если вы хотите получить код выхода из процесса в этом случае, вы должны запустить его как подпроцесс, т.е. не используя exec (просто command_that_will_fail).В этом случае процесс bash будет выступать в роли супервизора, который ожидает завершения подпроцесса и может проверить код выхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...