vars & error code & pipe

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
fhdfsgjcwe
проходил мимо

vars & error code & pipe

Непрочитанное сообщение fhdfsgjcwe » 2007-08-11 14:56:22

Есть некое выражение foo | bar. Вывод этого выражения записывается в переменную name, а код ошибки(выхода) команды foo записывается в переменную name_err. По моей дырявой логике все выражение должно иметь вид name=$( (foo; name_err=$?) | bar ). Но работает только так:

Код: Выделить всё

name=/tmp/foo
foo > $name
name_err=$?
name=$(cat $name | bar)
Это как так? Почему ни (foo; name_err=$?), ни { foo; name_err=$?; } не работет? Причем последнее работает, но только не в $().
Единственное, что мне гугл предложил было: name_err=$( ((foo; echo $? >&3) | bar >&4) 3>&1) 4>&1. Однако внутри $(), сей хак выдает $0: 4: Bad file descriptor. Куда он (4-й дескриптор-то) делся?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35436
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: vars & error code & pipe

Непрочитанное сообщение Alex Keda » 2007-08-11 19:00:36

Код: Выделить всё

name=` (foo; name_err=$?) | bar `
так не пробовал?
Убей их всех! Бог потом рассортирует...

fhdfsgjcwe
проходил мимо

Re: vars & error code & pipe

Непрочитанное сообщение fhdfsgjcwe » 2007-08-12 0:45:34

А у тя работает что ли? У мя нет, name_err пустая.
Если не ошибаюсь, то `` - однослойный, а $() многослойный способ замены строки выводом команды. Согласно ману sh(1) оба вызывают subshell, в котором все и испольняется, по аналогии с (), но не {}. Так что есть подозрение, что переменная name_err исчезает вместе с концом исполнения subshell, однако выражение foo=$(bar=value)foo=$( { bar=value; } )) говорит об обратном. Однако не трудно догадаться, что $() не дает права вкладывать более subshell'ы, из которых можно вынуть переменные в вызывающую (оригинальну) оболочку, т.е., если foo=$( (bar=value) ), то извлечь значение bar уже не удасться. Но опять же, замена () на {} не сделает конструкцию name=$( { foo; name_err=$?; } | bar ) рабочей.

Еще идеи?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35436
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: vars & error code & pipe

Непрочитанное сообщение Alex Keda » 2007-08-12 8:54:54

ладно.
а что мешает разложить на несколько команд?
и синтаксис понятней будет
Убей их всех! Бог потом рассортирует...