Почему stderr из подоболочки не подавляется и не перенаправляется?

Я знаю, что подоболочки подавляют свой стандартный вывод из вывода вызывающей стороны:

a=$(echo 123)
echo a:$a

Это выводит, как и ожидалось:

a:123

Но почему stderr не подавляется, поскольку он находится в подоболочке?

a=$(>&2 echo 123)

Ожидаемый результат:

(ничего такого)

Фактический результат:

123

Вот тест, в котором stderr должен перенаправляться на стандартный вывод и записываться в переменную a:

a=$(>&2 echo 123 2>&1)
echo a:$a

Ожидаемый результат:

a:123

Фактический результат:

123
a:

person Zhro    schedule 08.11.2017    source источник


Ответы (2)


Вывод не подавляется; оно захвачено. В этом разница между обычной подоболочкой (echo foo) и подстановкой команд a=$(echo foo). Кроме того, подстановка команды не фиксирует стандартную ошибку, а только стандартный вывод.

person chepner    schedule 08.11.2017
comment
Можно ли захватить stderr из подоболочки с помощью подстановки команд? - person Zhro; 08.11.2017
comment
Строго говоря, нет. Вам нужно пройти через некоторые искажения, чтобы скопировать стандартный вывод в другой файловый дескриптор, скопировать стандартную ошибку в стандартный вывод, а затем решить, что делать с исходным стандартным выводом. - person chepner; 08.11.2017

Вот тест, в котором stderr должен перенаправляться на стандартный вывод и записываться в переменную a:

a=$(>&2 echo 123 2>&1)

No.

  1. Сначала вы перенаправляете fd1 на то, что в данный момент использует fd2: >&2 -- теперь stdout указывает на stderr.
  2. Затем вы перенаправляете fd2 на то, что в данный момент использует fd1: 2>&1 -- теперь stderr указывает на stderr.

Если вы хотите, чтобы stderr указывал на стандартный вывод, вы не можете сначала перенаправить стандартный вывод. Удалите >&2

person Community    schedule 08.11.2017