Можно ли сохранить статус завершения последней команды ( $?
) без изменений после теста?
Например, я хотел бы сделать:
command -p sudo ...
[ $? -ne 1 ] && exit $?
Последний exit $?
должен возвращать статус выхода sudo, но вместо этого он всегда возвращает 0
(код завершения теста).
Возможно ли это сделать без временной переменной?
Еще один пример для уточнения:
spd-say "$@"
[ $? -ne 127 ] && exit $?
В этом случае я хочу выйти, только если найдена первая команда (код выхода! = 127
). И я хочу выйти с фактическим spd-say
кодом выхода (это не может быть
0
).
РЕДАКТИРОВАТЬ: я забыл упомянуть, что я предпочитаю решение жалоб POSIX для лучшей переносимости.
Я использую эту конструкцию в сценариях, где я хочу предоставить альтернативы для той же команды. Например, см. Мой скрипт crc32 .
Проблема с временными переменными заключается в том, что они могут скрывать другие переменные, и во избежание этого вы должны использовать длинные имена, что плохо для читабельности кода.
[ $? -ne 127 ] && exit $?
)
sudo
команда выполнена успешно (то есть, если sudo
завершается со статусом 0). Но в вашем коде сценарий продолжает работать (неsudo
завершается ), если это удается
command
а не sudo
на всех. Это то, что подразумевается под тем, что я хочу выйти, только если первая команда найдена (код выхода! = 127) и является указанным возвращением,command
когда вызываемая команда не найдена. Я предполагаю, что проблема в том, что вызов в sudo
качестве части теста позволяет sudo
подавить возврат command
в первую очередь и таким образом исказить тест.
if ! command -p sudo; then exit; fi
то же самое для вашего примера.