Вы можете явно проверить $?
, чтобы получить статус завершения последней выполненной команды:
status() {
if (( $? == 0 )); then
echo "true"
else
echo "false"
fi
}
(Это более надежно, чем a && b || c
, который может запускать и b
и c
, если a
имеет значение true, но b
обнаруживает ошибку во время выполнения).
После:
$ true; status
true
$ false; status
false
Кстати, я бы лично написал это так, чтобы инвертировать управление потоком:
run_with_status() {
local retval
if "$@"; then
echo "true"
else
retval=$?
echo "false"
return "$retval"
fi
}
run_with_status true
run_with_status false
Эта форма будет лучше воспроизводиться с set -e
(который в противном случае завершится при ошибках до достижения возможности печатать false
) или с ERR
ловушками, и позволит избежать потенциальных ошибок, когда кто-то добавит echo
для ошибки непреднамеренное ведение журнала изменяет значение $?
.