Почему bash eval возвращает 0 при выходе из команды со статусом> 0? - PullRequest
0 голосов
/ 23 октября 2018

Я не могу сообразить, что использование Bash eval при выполнении команды, которая явно завершается со статусом> 0, все еще возвращается с 0. Рассмотрим этот пример:

> eval "$(exit 42)"
> echo $?
0

Команда$(exit 42) сам по себе имеет код выхода> 0, поэтому, согласно странице man, eval должен возвращать себе статус выхода 42 ...

eval [arg ...]
    The args are read and concatenated together into a single command. This command is
    then read and executed by the shell, and its exit status is returned as the value
    of eval. If there are no args, or only null arguments, eval returns 0.

Что я неправильно понимаю?

1 Ответ

0 голосов
/ 23 октября 2018

Снова читая вопрос и выдержку из руководства, аргумент eval раскрывается до вызова eval.

"$(exit 42)" раскрывается в пустую строку, и команда становится eval '', которая завершается с успехом.

set -x может использоваться для отслеживания происходящего

set -x
> eval "$(exit 42)"
++ exit 42
+ eval ''

однако

> x=$(exit 42)
++ exit 42
+ x=
> echo "$?"
+ echo 42
42

Также обратите внимание, что одинарные кавычки отличаются, потому что расширение обрабатывается eval eval '$(exit 42)' возвращает 42

> eval '$(exit 42)'
+ eval '$(exit 42)'
+++ exit 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...