Можно ли сохранить статус завершения последней команды ( $?) без изменений после теста?
Например, я хотел бы сделать:
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то же самое для вашего примера.