Почему этот сценарий не работает?

#!/bin/bash rm out mkfifo out nc -l 8080 < out | while read line do echo hello > out echo $line done 

Если я перейду к IP-адресу машины, на которой работает этот скрипт (с использованием порта 8080), я ожидаю увидеть слово «привет», а затем на машине, на которой запущен скрипт, я ожидаю, что он выведет строки из запроса.

Однако ничего не происходит. Браузер не получает ответа, и ничего не выводится на терминал сервера.

Почему он не работает, и что я могу изменить, чтобы заставить его работать? Я хочу держать его в простых трубах, я не хочу использовать замену процесса или что-то в этом роде.

  • Shell scripting помогает текстовому файлу в массив
  • запускать несколько значений из файла по одной команде один за другим
  • Можно ли сравнить параметр сценария с массивом переменных и обработать его?
  • Переименование и переупорядочение нескольких имен файлов без переименования
  • Что означает `1 >>` и `2 >>` в сценарии bash?
  • Знайте, какой процесс выполняет I / O без iotop
  • Определение общего интерпретатора для такой программы, как ожидать?
  • как я могу подавить unedsary вывод seds при использовании опции -e?
  • One Solution collect form web for “Почему этот сценарий не работает?”

    Перенаправление < out заставляет именованный канал открываться для чтения. Это блокирует до тех пор, пока ни один процесс не будет открыт для записи. Между тем, правая сторона конвейера блокируется в команде read , ожидая, пока nc (который еще не запустился), чтобы вывести что-то через трубу. Это тупик .

    Чтобы сценарий продолжался, убедитесь, что именованный канал открыт для записи и для самостоятельного чтения. Например:

     nc -l 8080 < out | while read line do echo hello >&3 echo "$line" done 3>out 

    или

     nc -l 8080 < out | { exec 3>out while read line do echo hello >&3 echo "$line" done } 

    Обратите внимание: что-то вроде этого не сработает, потому что nc увидит, что его ввод закрыт после чтения 0 байтов, а последующие записи блокируют ожидание, когда именованный канал будет снова открыт для чтения:

     nc -l 8080 < out | { : >out while read line do echo hello >out echo "$line" done } 
    Interesting Posts

    Сценарий для отображения только файлов типа ASCII в текущем каталоге?

    tr аналог для символов Unicode?

    Как остановить sudo PAM-сообщения в auth.log для конкретного пользователя?

    Как запустить команду времени по умолчанию при выполнении определенных команд?

    найти все жестко связанные файлы между двумя каталогами

    Можно ли восстановить восстановленные файлы?

    Libre Office меняет тип языка принтера из PDF в Postscript

    Playerctl / dbus не работает с Spotify

    Некоторые элементы автозагрузки, которые не работают после обновления Debian Jessie

    Другой вопрос об исключении строки Bash (с использованием эха)

    Как отправить мышь и клавиатуру в гостевую систему Virt-Manager

    Пользователь selinux добавляет постепенное замедление

    Найти определенный файл в ближайшем предке текущего рабочего каталога

    понять выход bsdlabel

    Изображение PNG не отображается для значка рабочего стола на Fedora 16/17 с Gnome

    Linux и Unix - лучшая ОС в мире.