2011-07-06 2 views
1

Вот упрощенный пример сценария, который я пишу (не работает как есть).Сценарий Bash не будет перенаправлять ввод в подпроцесс

Я хочу направить STDOUT из моего сценария в STDIN подпроцесса.

В приведенном ниже примере я пишу 'test' для STDOUT и хочу, чтобы он перешел к подпроцессу, который в конечном итоге записывает его в файл.

#!/bin/bash 
exec 4<&1 
(cat >/tmp/output)& <&4 
while true; do echo test; sleep 1; done 
+0

Я не уверен, что вы понимаете, что вы ожидаете от своего сценария. Вы хотите, чтобы выход «echo test» был направлен в STDIN другого процесса, не так ли? – jopasserat

+0

Да, это то, что я пытаюсь сделать, а coproc - идеальное решение. Основная проблема, которую я абстрагировал из этого вопроса, заключается в том, что в этом случае сопроцессом является netcat, и мне нужно выполнить его как подпроцесс, чтобы я мог отслеживать, когда он выйдет (когда соединение сокета завершится неудачно из-за сетевой ошибки или перезагрузки сервера) и перезапустите соединение или установите флаг для вывода буфера до тех пор, пока соединение не будет восстановлено. –

ответ

2

Вы также можете попробовать создать простую систему клиент-сервер, используя именованные каналы (fifos).

См: Send command to a background process (с дальнейшими ссылками)

+0

coproc была особенностью, которую я не понимал полностью. Отличный момент, спасибо. Я легко мог выполнить именно то, что мне нужно, теперь процесс «coproc» может легко получить вход из внешнего скрипта. –

0

Пример странный. Вы хотите, чтобы к выходу/tmp/output присоединялся stdout echo test? Если да, то

while true 
do 
    echo test >> /tmp/output 
    sleep 1 
done 
+0

Возможно немного упрощенное. Тест echo существенно заменяет большой раздел кода, который контролирует файл состояния для изменений, анализирует его и в конечном итоге должен записывать некоторые результаты в сокет с помощью netcat (или записывать в буферный файл, если процесс netcat не может подключиться на сервер, или если он теряет это соединение). –

2

A (пол) стандартный метод для такого рода вещи:

 
#!/bin/sh 

test -t 1 && { $0 ${1+"[email protected]"} | cat > /tmp/output; exit; } 
... 

Если скрипт запускается с стандартным выводом на TTY, то повторно запустить с выходом по трубопроводу кошке.

1

В Баш, вы можете использовать подстановку процесс, чтобы создать подпроцесс и exec перенаправить вывод скрипта:

#!/bin/bash 
exec > >(cat >/tmp/output) 
while true; do echo test; sleep 1; done 
+0

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

0

окончательное решение, благодаря @ указатель Йона к coproc:

#!/bin/bash 
coproc CPO { cat >/tmp/output; } 
while true; do echo test >&${CPO[1]}; sleep 1; done 

в действительности «эхо тест» заменяется сложной последовательности мониторинга и разборе аф ile, а подпроцесс cat заменен netcat на сервер, и это соединение контролируется с помощью ловушки при выходе netcat.

Спасибо за все замечательные ответы!

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