[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