Как получить код ошибки из подоболочки, запущенной в eval - PullRequest
0 голосов
/ 10 января 2019

Я пытался найти вопросы, похожие на эти, которые касаются решения для меня, но ни один из тех, которые я не смог найти, вполне отвечает на мой точный вопрос.

Я хотел бы запустить команду в подоболочке внутри вызова 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 Ответ

0 голосов
/ 10 января 2019

Если вы действительно обеспокоены состоянием выхода, не используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...