LINUX.ORG.RU

Как обработать код возврата с set -e

 


0

1

Использую set -e для упрощения обработки ошибок в shell-скрипте. Но в одном месте нужна более сложная обработка. Т.е. я вызываю определённую команду и после этого мне нужно получить код ошибки.

Для иллюстрации покажу следующий пример:

#!/bin/sh

set -e

(exit 2)
rv=$?
echo "rv=$rv"

В данном случае мне нужно продолжить выполнение после того, как subshell вернул ошибку. И обработать конкретное значение этой ошибки.

Понятно, что можно сделать set +e в нужном месте. Но может быть есть какой-то более изящный трюк?

★★★★

Нужно явно результат проверять через if или ||:

$ cat a.bash
#!/bin/sh

set -e

rv=0
(exit 2) || rv=$?
echo "rv=$rv"
$ ./a.bash
rv=2
sf ★★★
()
Ответ на: комментарий от sf

Во, спасибо, то, что хотел.

vbr ★★★★
() автор топика
Ответ на: комментарий от mky

Читал, думаю, что это меньшее зло, чем писать || exit после каждой команды.

vbr ★★★★
() автор топика
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от ABW

Я привёл ссылку, каждый пример из которой нужно разобрать, чтобы понять, где ″set -e″ сработает, а где нет. ТС, похоже, этого делать не стал. Я не вижу особой разницы между вашим кодом и таким:

if ( exit 2 ) ; then rv=0; else rv=$?; fi
echo $rv

А то, что ″set -e″+″set -o pipefail″ ведёт к «рандомизации» выполнения ″command | head -n1″ нужно бы в man записать...

mky ★★★★★
()
Ответ на: комментарий от mky

Я не вижу особой разницы

Да и я не вижу, кроме количества символов.
А вообще-то я сам никогда этим не пользуюсь и считаю скорее вредным и развращающим молодые неокрепшие умы.
Вон ТС пишет:

думаю, что это меньшее зло, чем писать || exit после каждой команды.

но ведь подобный стиль демонстрирует только то, что он начинает писать раньше, чем подумает о том, что ему на самом деле нужно.

ABW ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.