Как получить код ошибки из подоболочки, запущенной в eval
Я пытался найти вопросы, похожие на эти, которые касаются решения для меня, но ни один из тех, которые я не смог найти, вполне отвечает на мой точный вопрос.
Я хотел бы выполнить команду в подоболочке внутри вызова eval и получить код состояния, возвращаемый функцией, вызываемой внутри подоболочки.
Например, я вызываю такую команду:
eval "$(some_command)"
if [ "${?}" -ne 0 ]
then
# do stuff if `some_command` returned status code not equal to zero
fi
это some_command
Функция возвращает список переменных среды и их присваиваний, например:
$ some_command # Execute some_command in a standard fashion without eval or subshell
some_env_variable='some_value'
another_env_variable='another value'
Цель состоит в том, чтобы запустить эту единственную команду, чтобы добавить эти переменные среды в текущую среду. Единственный способ сделать это - позвонить some_command
в подоболочке, и имейте eval, оценивают получающийся результат. Если я сделаю это без подоболочки, eval просто запустится some_command
но он не оценивает свои выходные данные, чтобы добавить переменную среды в текущую среду.
Это работает:
$ eval "some_command"
-bash: some_command: command not found
$ echo $?
127
Это работает:
$ $(some_command)
-bash: some_command: command not found
$ echo $?
127
Но это не работает
$ eval "$(some_command)"
-bash: some_command: command not found
$ echo $?
0
Должен быть какой-то способ получения результирующего кода состояния из some_command, но я не смог определить, каким образом. Любая помощь приветствуется!
1 ответ
Если вы действительно обеспокоены состоянием выхода, не используйте eval
немедленно.
if envvars=$(some_command); then
eval "$envvars"
else
# do something else
fi
Если вам нужен точный код ошибки, вместо того, чтобы различать 0 и ненулевое значение:
envvars=$(some_command)
rv=$? # save it for later if necessary
case $rv in
0) eval "$envvars" ;;
1) ... ;;
2) ... ;;
# etc
*) printf 'Some other error %d\n' "$rv" >&2 ;;
esac