Как подключить stderr к stdin, используя каналы? - PullRequest
0 голосов
/ 15 сентября 2011

"|"Трубный оператор подключает стандартный вывод одного процесса к стандартному порту другого.Есть ли способ создать канал, который соединяет stderr одного процесса с stdin другого, поддерживая stdout в моем терминале?Поиск в интернете не дал мне никакой информации ...

Заранее спасибо, Михалис.

Ответы [ 4 ]

2 голосов
/ 15 сентября 2011

Вы можете получить этот эффект с помощью функции подстановки процессов в bash:

somecommand 2> >(errorprocessor)
2 голосов
/ 15 сентября 2011

Вы также можете поменять местами потоки stdout и stderr, т.е. stdout становится новым stderr, а stderr становится новым stdout).

# only the stdout stream gets upcased
ls -ld / xxx ~/.bashrc yyy 3>&1 1>&2 2>&3 3>&- | tr '[[:lower:]]' '[[:upper:]]'

# block original stdout by closing fd 1
ls -ld / xxx ~/.bashrc yyy 2>&1 1>&- | tr '[[:lower:]]' '[[:upper:]]'
2 голосов
/ 15 сентября 2011

Вы можете использовать именованные каналы:

mkfifo /my/pipe
error-handler </my/pipe &
do-something 2>/my/pipe

Это должно держать stdin & stdout «do-what» в вашем терминале и перенаправлять stderr в / my / pipe, который читается «обработчиком ошибок».

(надеюсь, эта работа, bash для тестирования нет)

2 голосов
/ 15 сентября 2011

Если вы счастливы смешать stdouot и stderr, тогда вы можете сначала перенаправить stderr в stdout, а затем передать следующее:

theprogram 2>&1 | otherprogram

Если вам не нужен stdoutВы можете убить его:

theprogram 2>&1 1> /dev/null | otherprogram

Если вы хотите сохранить исходный стандартный вывод, вам нужно перенаправить его либо в файл (вместо /dev/null), либо в другой файл.дескриптор, который вы открыли ранее с exec. Вот некоторые подробности.

(К сожалению, прямой синтаксис "pipe this file descriptor", такой как 2|, отсутствует. Это было бы удобно.)

...