LINUX.ORG.RU

Элегантный способ проверить код выхода программы

 , , ,


1

5

Привет ЛОР,

Вопрос по программированию на пайпах и сигналах. Есть такой вот код:

someprogram
rc=$?

if [ "x$rc" = "x0" ] ; then
    # что-то делаем (нетривиально, несколько строчек)
else
    # обработка ошибки (тоже нетривиально)
fi

Хотелось бы более элегантное решение, например:

# ...
if test --is-exit-success "$rc" ; then
    # ...
else
    # ...
fi
В данном случае someprogram && ... || ... выглядит некрасиво (даже с группами команд { ... }):
someprogram && {
    # success
} || {
    # failure
}
Да и логически немного отличается от if ... then ... else

Кто как подобное делает в баше?

bash
элегантное решение

/0

anonymous
()
Ответ на: комментарий от joy4eg

Just in case:

[ "x$rc" = "x0" ]

«x$rc»

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

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

но там строчка вызова программы довольно длинная

if someprogram     \
    --arg la-la-la \
    --foo bar      \
    --bar fooo     \
then
...
fi
joy4eg ★★★★★
()
Ответ на: комментарий от KennyMinigun

B bash короче всего проверить заведомо числовую переменную на ноль/не ноль - let.
Можно ещё

  Pass () { # [<int <exit_status>>]
    # Yields given exit status, or exit status of last executed command.
    return "${1:-${?}}"
  } # Pass

ABW ★★★★★
()

bash

posix, shell

Так bash или POSIX sh?

Хотелось бы более элегантное решение

if (( rc )); then
    …
anonymous
()
Ответ на: комментарий от Alyssa

ТС так и делает, просит более элегантное решение.

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

этот икс был нужен очень давно

В переменной может быть -:

var=-b
[ "$var" = "foo" ]

для этого и нужен x. В данном конкретном случае не нужен, но безопаснее и проще писать его всегда.

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

Вообще-то [ по количеству аргументов сам догадывается, о чём его спрашивают.

$ [ -b = -b ]; echo $?
0
$ [ -b = foo ]; echo $?
1
anonymous
()
someprogram
rc=$?
((rc)) || echo "someprogram succeded"
((rc)) && echo "someprogram failed"

А вообще так не очень наглядно и явно не лучше чем if-then-else. С точки зрения удобства лучше использовать в таких случаях: someprogram && do-something-if-someprogram-succeded

Kroz ★★★★★
()

# ...
if test --is-exit-success «$rc» ; then
# ...
else
# ...
fi

Зачем?

# ...
if someprogram ; then
    # ...
else
    # ...
fi
# ...
someprogram
rc=$?
if ((rc)) ; then
    # ...
else
    # ...
fi

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)

Хотелось бы более элегантное решение, например:
if test --is-exit-success «$rc» ; then

Напиши функцию exit_success? в которой скроешь всю «неэлегантность»

exit_success?() {
  test $1 -eq 0
}


if exit_success? $rc; then

else

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

exit_success?

Не нужно так делать: ? раскроется в символ в имени существующего файла, попадающего под эту маску:

touch exit_success1

exit_success?() {
  test $1 -eq 0
}

exit_success? 1

bash: exit_success1: command not found

shdown
()
Ответ на: комментарий от anonymous

Хм, не знал. Но я бы не закладывался на то что в чуть более сложном выражении он не сломается, а также на то что все реализации test так работают (хотя FreeBSD'шная работает).

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

И не подумаю. Прекратите офтопить, тут не урок истории, а конкретно о $?

sdio ★★★★★
()

Пришла в голову вот такая фиговина: http://ideone.com/Pk85y3

rc() {
    return ${1:-1}
}

someprog 
ret=$?

# ...

if rc $ret; then
    # success
fi

Если не сохранять $? в отдельную переменную, то даже прилично выглядит

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

Добавь в начало скрипта

if (( $(true; echo $?) != 0 )); then
    echo >&2 "Oops, we're running on a non-existing platform."
    exit 1 # Хм, а вдруг здесь 1 == EXIT_SUCCESS?...
fi
anonymous
()
Ответ на: комментарий от sdio

Хех, вот что я назвал бы «элегантным способом»

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