Использование именованных каналов для создания «петли» - PullRequest
1 голос
/ 21 февраля 2012

Я очень новичок в написании сценариев оболочки и пытаюсь разобраться с трубопроводом. Я мог бы идти совсем не туда ...

У меня есть сценарий оболочки, который содержит простой цикл true, и в этом цикле я получаю netcat для прослушивания на указанном порту и передаю входные данные в двоичный файл, ожидающий команд через stdin. Это Script-A

У меня есть второй сценарий оболочки, который принимает входные данные в качестве аргументов, а затем выводит эти аргументы в порт, который прослушивает netcat. Это Script-B

Моя цель - получить возвращаемый вывод из двоичного файла, находящегося в Script-A, в Script-B через Netcat, чтобы его можно было вернуть через стандартный вывод. Двоичный файл должен быть инициализирован и ожидает ввода.

Вот что у меня есть:

Скрипт-A

while true; do
    nc -kl 1234 | /binarylocation/ --readargumentsfromstdinflag
done

Скрипт-B

foo=$(echo "$*" | nc localhost 1234)
echo "$foo"

При такой настройке вывод двоичного файла осуществляется через Script-A Проведя некоторые исследования, которые я дошел до этого момента, я пытаюсь использовать именованный канал для создания своего рода цикла из двоичного файла обратно в netcat, он все еще не работает -

Скрипт-A

mkfifo foobar

while true; do
    nc -kl 1234 < foobar | /binarylocation/ --readargumentsfromstdinflag > foobar
done

Скрипт-B не изменился.

Имейте в виду, что мой опыт написания сценариев в оболочке длится около одного дня, спасибо.

1 Ответ

1 голос
/ 21 февраля 2012

Проблема в вашем скрипте B .. netcat читает из STDIN и выходит сразу после закрытия STDIN, не ожидая ответа.

вы поймете, когда сделаете следующее:

foo=$( ( echo -e "$*"; sleep 2 ) | nc localhost 1234) 
echo "$foo"

nc имеет параметр для поведения stdin ..

 -q    after EOF on stdin, wait the specified number of seconds and 
       then quit. If seconds is negative, wait forever.`

Так что вы должны сделать:

foo=$( echo -e "$*" | nc -q5 localhost 1234) 
echo "$foo"
...