2010-03-31 3 views
19

Давайте представим, у меня есть Баш скрипт, где я называю это:Можно ли получить код выхода из подоболочки?

bash -c "some_command" 
do something with code of some_command here 

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

+0

Я не уверен в ваших причинах для выполнения косвенно - эта подоболочка наследует среду от вызывающего скрипта. Просто попробуйте 'export FOO =" foo "; bash -c 'echo $ FOO'' (одинарные кавычки, поэтому он не расширяется до тех пор, пока не будет запущена подседка). – Cascabel

+2

Он наследует среду, но не изменяет среду для текущей оболочки. Любые изменения, которые он внесет в env. после смерти он исчезнет. – Geo

+0

Если вы хотите что-то запустить, не опуская родительскую оболочку, я бы использовал подселочку, http://tldp.org/LDP/abs/html/subshells.html – slm

ответ

22

$? будет содержать код возврата some_command, как обычно.

Конечно, он может также содержать код из bash, если что-то пошло не так, прежде чем ваша команда может быть выполнена (неправильное имя файла, whatnot).

6

Вы можете использовать переменную $?, ознакомьтесь с документацией bash для этого, она сохранит статус выхода последней команды.

Кроме того, вы можете проверить командные блоки в стиле скобок bash (например, comm1 && (comm2 || comm3) && comm4), они всегда выполняются в подоболочке, таким образом не изменяя текущую среду и также более мощные!

EDIT: Например, при использовании() -строчных блоков по сравнению с bash -c 'command вам не нужно беспокоиться об экранировании любых строк аргументов с пробелами или любого другого специального синтаксиса оболочки. Вы напрямую используете синтаксис оболочки, это нормальная часть остальной части кода.

+3

Другими словами, '(some_command)' вместо 'bash -c" some_command "' –

18

Вот иллюстрация $? и скобка подоболочка упоминается Paggas и Матти:

$ (exit a); echo $? 
-bash: exit: a: numeric argument required 255 
$ (exit 33); echo $? 
33 

В первом случае код ошибки Баш, а во втором случае это код выхода от exit.

+0

Вы не имеете в виду '$ (...)', а не '$ (...)'? Последнее не только недействительно, но и очень запутанно. – Evi1M4chine

+4

@ Evi1M4chine: Знак доллара - это подсказка в этом случае. Он не предназначен для ввода. Голые круглые скобки устанавливают подоболочку, как указано в моем ответе, и вы можете получить код выхода и не выйти из основной оболочки. –

+1

Ах. Все еще делает вещи запутанными. Не ваша ошибка, хотя стандартное приглашение совпадает с индикатором переменной. :) – Evi1M4chine

Смежные вопросы