From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <44400281.1090902@altlinux.org> Date: Sat, 15 Apr 2006 00:13:53 +0400 From: Alexey Rusakov User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060328 Thunderbird/1.5 Mnenhy/0.7.3.0 MIME-Version: 1.0 To: ALT Devel discussion list References: <20060414154621.GA3423@localhost> <443FE885.7090807@altlinux.org> <20060414193432.GC11323@localhost> In-Reply-To: <20060414193432.GC11323@localhost> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [devel] /bin/sh errexit semantics X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.7 Precedence: list Reply-To: ALT Devel discussion list List-Id: ALT Devel discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Apr 2006 20:13:53 -0000 Archived-At: List-Archive: List-Post: 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