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

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

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

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

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

  • Сортировка одного файла по строке на основе другого файла
  • Я хочу сравнить два списка и распечатать вывод разности из списка 1
  • echo $ вместе с переменной
  • добавить имя файла в текст в углу файла изображения
  • Список сведений о файлах / каталогах с пробелами
  • Файл Java не компилируется в cron
  • Скопировать содержимое одного скрипта в другой скрипт
  • Как разобрать строку в bash на переменные, используя вкладку в качестве разделителя и сохранить пробелы?
  • 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 } 
    Linux и Unix - лучшая ОС в мире.