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

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

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

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

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

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 } 
  • Выполнять команду CURL только один раз в скрипте?
  • Загружать программные двоичные файлы при загрузке
  • Ввод папки с пробелами и escape-символами с использованием bash
  • Синтаксическая ошибка: неожиданный конец файла
  • Имя файла, начинающееся с - (тире)
  • Запрос Bash на запись в каждый каталог под некоторым путем и запуск команды, когда он внутри?
  • Любой способ, с помощью которого я могу преобразовать любую заданную временную метку в стандартную в BASH
  • Составные команды в && / || состояние
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • вставить значение в конце каждой записи на основе уникальных идентификаторов
  • Для отдельных циклов $ i
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.