2015-07-10 5 views
1

У меня есть следующие два Баш скрипты:Баш Перенаправление дескриптор файла

one.bash:

#!/bin/bash 

echo "I don't control this line of output to stdout" 

echo "I don't control this line of output to stderr" >&2 

echo "I do control this line of output to fd 5" >&5 

callone.bash:

#!/bin/bash 

# here I try to merge stdout and stderr into stderr. 
# then direct fd5 into stdout. 

bash ./one.bash 1>&2 5>&1 

Когда я бегу это так: bash callone.bash 2>stderr.txt >stdout.txt

Файл stderr.txt выглядит так:

I don't control this line of output to stdout 
I don't control this line of output to stderr 
I do control this line of output to fd 5 

и stdout пуст.

Я бы хотел, чтобы строка «do control» выводилась только на stdout.txt.

Ограничения на внесение изменений являются:

  1. я могу изменить что-либо в callone.bash.
  2. Я могу изменить строку в one.bash, которую я контролирую.
  3. Я могу добавить exec в one.bash, относящийся к файловому дескриптору 5.
  4. Мне нужно запустить скрипт, как указано.

[EDIT] Вариант использования для этого: у меня есть сценарий, который выполняет все виды других скриптов, которые могут выводиться на stderr и stdout. Но мне нужно убедиться, что пользователь видит только хорошо контролируемое сообщение. Поэтому я отправляю сообщение с контролируемым управлением в fd5, а все остальное (stdout & stderr) отправляется в журнал.

ответ

7

Перераспределение происходит на заказ.

После запуска 1>&2 вы заменили ФО 1 с дескриптором 2.

Итак, когда вы запустите 5>&1 перенаправлении FD 5, где 1 указывает FD Теперь (не там, где это было, когда она началась) ,

Вы должны инвертировать два переназначения:

bash ./one.bash 5>&1 1>&2 
+0

Забавная вещь, что когда трубы ввязываться, это * не * то же самое. – o11c

+0

@ o11c, сначала устанавливается труба, затем перенаправления. См. Http://stackoverflow.com/a/12027221/1524545 – geirha

+0

@ o11c Что не то же самое? –

Смежные вопросы