У меня есть это в сценарии Bash:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Похоже, он выйдет сразу после команды выхода, что имеет смысл. Мне было интересно, есть ли какая-то простая команда, которая может предоставить код выхода, не выходя сразу?
Я собирался угадать:
exec exit 3
но он выдает сообщение об ошибке: exec: exit: not found
. Что я могу сделать? :)
bash
shell-script
exec
exit
exit-status
G-Man говорит: «Восстанови Монику»
источник
источник
exec exit 3
это не Буэно, я получаю"exec: exit: not found"
exit_code=3
и полностью исключитьexit 3
линию?$?
переменную, но не выходил из этого сценария»?Ответы:
Если у вас есть скрипт, который запускает какую-то программу и смотрит на состояние завершения программы (с
$?
), и вы хотите протестировать этот скрипт, выполнив что-то, что заставляет$?
быть установлено какое-то известное значение (например,3
), просто выполнитеСкобки создают вложенную оболочку. Затем
exit
команда заставляет эту вложенную оболочку завершиться с указанным состоянием выхода.источник
exit_code="3"
для тестированияexit
это встроенный Bash, так что вы не можетеexec
это сделать. В соответствии с руководством Bash :Собирая все это вместе, я бы сказал, что ваш единственный вариант - сохранить желаемый статус выхода в переменной, а затем
exit $MY_EXIT_STATUS
при необходимости.источник
$?
(хотя я не совсем уверен, почему вы это сделаете), это кажется надежным ответом. Если вы просто хотите установить какое-либо неудачное значение,false
это еще один вариант.Вы можете написать функцию, которая возвращает статус, указанный в качестве аргумента, или,
255
если ничего не указано. (Я называю это,ret
поскольку это "возвращает" свое значение.)и использовать
ret
вместо вашего звонкаexit
. Это позволяет избежать неэффективности создания вложенной оболочки в принятом в настоящее время ответе.Некоторые измерения.
на моей машине занимает около 3,5 секунд.
на моей машине занимает около 0,051 секунды, в 70 раз быстрее. Ввод обработки по умолчанию все еще оставляет в 60 раз быстрее. Очевидно, что цикл имеет некоторые накладные расходы. Если я изменю тело цикла на «просто»
:
илиtrue
тогда время уменьшится вдвое до 0,025, совершенно пустой цикл будет недопустимым синтаксисом. Добавление;:
в цикл показывает, что эта минимальная команда занимает 0,007 секунды, поэтому накладные расходы цикла составляют около 0,018. Вычитание этих накладных расходов из двух тестов показывает, чтоret
решение более чем в 100 раз быстрее.Очевидно, что это синтетическое измерение, но все складывается. Если вы делаете все в 100 раз медленнее, чем нужно, то в итоге вы получаете медленные системы. 0.0
источник
О
exec exit 3
... он попытается запустить внешнюю команду с именемexit
, но ее нет, поэтому вы получите ошибку. Это должна быть внешняя команда, а не встроенная в оболочку, поскольку она полностьюexec
заменяет оболочку. Это также означает, что даже если у вас была вызвана внешняя командаexit
,exec exit 3
вы не вернетесь, чтобы продолжить сценарий оболочки, поскольку оболочки больше не будет .источник
exec bash -c "exit 3"
, но в настоящее время я не могу придумать ни одной причины, чтобы сделать это, в отличие от простоexit 3
.exec
«или простоexit
» остановит сценарий, что не похоже на то, чего хотел вопрос.Вы можете сделать это с Awk:
Или сед:
источник
sh -c 'exit 9'
(exit 9)
в принятом ответе