Страница 1 из 1

vars & error code & pipe

Добавлено: 2007-08-11 14:56:22
fhdfsgjcwe
Есть некое выражение 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-й дескриптор-то) делся?

Re: vars & error code & pipe

Добавлено: 2007-08-11 19:00:36
Alex Keda

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

name=` (foo; name_err=$?) | bar `
так не пробовал?

Re: vars & error code & pipe

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

Еще идеи?

Re: vars & error code & pipe

Добавлено: 2007-08-12 8:54:54
Alex Keda
ладно.
а что мешает разложить на несколько команд?
и синтаксис понятней будет