Скрипт Bash не перенаправляет ввод в подпроцесс - PullRequest
1 голос
/ 06 июля 2011

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 06 июля 2011

(Полу) стандартная техника для такого рода вещей:

#!/bin/sh

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

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

2 голосов
/ 06 июля 2011

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

См .: Отправить команду фоновому процессу (с дальнейшими ссылками)

1 голос
/ 06 июля 2011

В bash вы можете использовать подстановку процесса для создания подпроцесса и exec для перенаправления вывода скрипта:

#!/bin/bash
exec > >( cat >/tmp/output )
while true; do echo test; sleep 1; done
0 голосов
/ 06 июля 2011

Идеальное решение благодаря указателю @ jon на coproc:

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

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

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

0 голосов
/ 06 июля 2011

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

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