2016-05-31 6 views
0

Я прошел несколько учебников по i/o bash, но большинство из них касается перенаправления потока в/из файлов.bash перенаправление stdin на скрипт

Моя проблема заключается в следующем: как перенаправить stdin/stdout/stderr в скрипт (или программу).

Например, у меня есть сценарий «parentScript.sh». В этом скрипте я хочу вызвать blackbox «childScript.sh», который принимает несколько аргументов -arg1 -arg2 ... и читает ввод из stdin.

Моя цель состоит в том, чтобы кормить childScript.sh с некоторым входом внутри parentScript.sh:

... 
childScript.sh -arg1 -arg2 
????? < "input1" 
????? < "input2" 
... 

Другой случай был бы я назвать несколько программ, и я хочу, чтобы разговаривать друг с другом, как это:

... 
program1 -arg1 -arg2 
program2 -arg1 -arg9 
(program1 > program2) 
(program2 > program1) 
etc... 
... 

Как решить эти 2 случая? Спасибо

EDIT: Чтобы быть более конкретным. Я хотел бы создать собственные каналы (названные или не названные) и использовать их для подключения нескольких программ или сценариев, чтобы они разговаривали друг с другом.

Например: program1 записывает в program2 и program3 и принимает из программы2. program2 записывает в program1 и program3 и получает из программы 1. program3 получает только форму program1 и program2.

+0

Возможный дубликат http://stackoverflow.com/questions/1987105/bash-redirect-standard-input-dynamically-in-a-script – Inian

+1

Прямо сейчас это, возможно, слишком велико. Независимо от того, применяются ли многие из методов построения программных трубопроводов (например, компоненты рекурсивных функций exec), зависит от деталей, которые вы не предоставляете.[Кроме того, «разъяснение» вопроса таким образом, которое резко меняет его значение * после того, как ответы уже предоставлены *, не является особенно хорошей формой, поскольку делает эти предыдущие ответы бесполезными]. –

+0

хорошо пункт. Я сделаю новую тему – tomtom

ответ

2

Труба | является вашим другом:

./script1.sh | ./script2.sh 

пошлет стандартный вывод из script1.sh в script2.sh. Если вы хотите отправить STDERR, а также:

./script1.sh 2>&1 | ./script2.sh 

И только STDERR:

./script1.sh 2>&1 >/dev/null | ./script2.sh 

Вы также можете сделать здесь документы:

./script2.sh << MARKER 
this is stdin for script2.sh. 
Variable expansions work here $abc 
multiply lines works. 
MARKER 

./script2.sh << 'MARKER' 
this is stdin for script2.sh. 
Variable expansions does *not* work here 
$abc is literal 
MARKER 

MARKER может быть практически что угодно: EOF, ! , hello, ... Одно замечание состоит в том, что не может быть никаких пробелов/вкладок напротив маркера конца.

И в Баш вы можете даже использовать <<<, который работает так же, как здесь документы, если кто-нибудь может уточнить это была бы оценена:

./script2.sh <<< "this is stdin for script2.sh" 
./script2.sh <<< 'this is stdin for script2.sh' 
+0

, см. в редакции – tomtom

0

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

childScript.sh -arg1 -arg2 <<EOT 
input1 
EOT 

childScript.sh -arg1 -arg2 <<EOT 
input2 
EOT 

И трубы вперед, чтобы сделать вывод первого сценария на вход второго:

program1 -arg1 -arg2 | program2 -arg1 -arg9 
+0

, см. edit – tomtom