Вы можете написать функцию, которая возвращает статус, указанный в качестве аргумента, или, 255
если ничего не указано. (Я называю это, ret
поскольку это "возвращает" свое значение.)
ret() { return "${1:-255}"; }
и использовать ret
вместо вашего звонкаexit
. Это позволяет избежать неэффективности создания вложенной оболочки в принятом в настоящее время ответе.
Некоторые измерения.
time bash -c 'for i in {1..10000} ; do (exit 3) ; done ; echo $?'
на моей машине занимает около 3,5 секунд.
time bash -c 'ret(){ return $1 ; } ; for i in {1..10000} ; do ret 3 ; done ; echo $?'
на моей машине занимает около 0,051 секунды, в 70 раз быстрее. Ввод обработки по умолчанию все еще оставляет в 60 раз быстрее. Очевидно, что цикл имеет некоторые накладные расходы. Если я изменю тело цикла на «просто» :
или true
тогда время уменьшится вдвое до 0,025, совершенно пустой цикл будет недопустимым синтаксисом. Добавление ;:
в цикл показывает, что эта минимальная команда занимает 0,007 секунды, поэтому накладные расходы цикла составляют около 0,018. Вычитание этих накладных расходов из двух тестов показывает, что ret
решение более чем в 100 раз быстрее.
Очевидно, что это синтетическое измерение, но все складывается. Если вы делаете все в 100 раз медленнее, чем нужно, то в итоге вы получаете медленные системы. 0.0
exec exit 3
это не Буэно, я получаю"exec: exit: not found"