Как перенаправить стандартный вывод из одного процесса для чтения в качестве файлового дескриптора 3 в другом?

Я хочу перенаправить (stdout, stderr) из одного процесса в (stdin, файловый дескриптор 3) другого. Как я могу это сделать?

Например, если у меня есть myscript.sh:

#!/bin/sh
# myscript.sh
echo "stdout"
echo "stderr" >&2

И reader.sh:

#!/bin/sh
# reader.sh
read key
echo "stdin: $key"
read key <&3
echo "fd3: $key"

Как передать вывод myscript.sh в reader.sh так, чтобы окончательный вывод был:

stdin: stdout
fd3: stderr

Самое близкое, что я получил, это:

./myscript.sh 2>&3 | ./reader.sh

Но это зависает в ожидании ввода (из fd 3)


person iffy    schedule 31.10.2013    source источник


Ответы (1)


Я бы сделал это с именованным каналом:

mkfifo err 
./myscript.sh 2>err | ./reader.sh 3<err

Выполнение 2>&3 в вашей попытке просто отправляет stderr туда, где родительская оболочка указала 3, и произойдет сбой, если вы еще не открыли 3 в этой оболочке. Это бесполезно для оболочки читалки 3; даже если бы он был унаследован, он был бы как fd для записи, а не для чтения.

person Mark Reed    schedule 31.10.2013
comment
Спасибо, Марк! Я только что наткнулся на mkfifo. Нет ли способа сделать это без именованного канала? - person iffy; 01.11.2013