[devel] /bin/sh errexit semantics
Alexey Rusakov
=?iso-8859-1?q?ktirf_=CE=C1_altlinux=2Eorg?=
Сб Апр 15 00:13:53 MSD 2006
Alexey Tourbin wrote:
> On Fri, Apr 14, 2006 at 10:23:01PM +0400, Alexey Rusakov wrote:
>
>>> Чего я интуитивно хочу: чтобы при вызове 'func || что-то' функция func
>>> отвалила бы на команде false, т.е. вернула бы статус false, а часть
>>> "after false" выполняться не должна. Почему я этого интуитивно хочу?
>>> Если бы функция func() была отдельным исполняемым файлом (который
>>> выполняется в режиме errexit), поведение было бы именно таким
>>>
>> Ну, в манах по этому поводу сказано, что если команда является частью
>> проверки условия, или её результат отрицается через !, или команда
>> является частью выражения с || или &&, то семантика errexit не
>> поддерживается. Я могу только посоветовать ставить хвосты "|| return $?"
>> везде в функции, где может быть неудачное выполнение команды.
>>
>
> Получается, что в errexit mode невозможно сделать wrapper для функции,
> который проверяет код возврата этой функции. Неконсистентно. Напр. в
> скрипте cmdcache используется такая конструкция:
>
> rc=0
> "$@" >out$$ || rc=$?
> if [ $rc -eq 0 ]; then
> сохранить в кеш out$$
> else
> удалить out$$
> return $rc
> fi
>
> Поскольку errexit в таком случае не работает, "$@" скорее всего вернёт 0.
> Если же убрать '|| rc=$?', то невозможно будет удалить out$$ в случае
> ненулевого возврата.
>
А так?
"$@" >out$$ && :
rc=$?
--
Alexey "Ktirf" Rusakov
Подробная информация о списке рассылки Devel