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

#!/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 } 
  • Чтение строк из файла в переменную
  • Измените значение в файле конфигурации или добавьте параметр, если он не существует?
  • Ограничение системных библиотек, которые программа может использовать
  • Самый простой способ прокомментировать / раскомментировать некоторые строки с помощью командной строки
  • что означает $ * в shell
  • Как синхронизировать два диска (или папки) с использованием символических (или жестких) ссылок (например, rsync)?
  • Как создать правило для замены пользовательского флага с помощью оболочки C?
  • временный файл не найден в sh-скрипте
  • Проверка того, что десятичное число находится в диапазоне от bc
  • Частота слов в тексте на неанглийском языке: как я могу объединить единичные и множественные формы и т. Д.?
  • Может ли переменная оболочки включать - символ?
  • Interesting Posts

    ЛУКС шифрует полный диск, сколько ОЗУ?

    Микрофон – подавление статического фонового шума в Linux

    моя команда разрешений работает неправильно

    Почему я получаю правильные результаты и ошибку в этом сценарии bash?

    awk: печатать строки после матча до конца файла

    Установить файловую систему только для чтения и перенаправить записи в ОЗУ?

    Что такое «магические аргументы» в системном вызове Linux reboot?

    Скрыть отдельный указательный указатель (из-за мерцания) в KDE в настройке двойного указателя с сенсорным экраном

    grep фиксированная строка в конце строки

    Файлы компьютеров Mac не могут быть сохранены, они всегда были перезаписаны

    Удаление префиксов из имен файлов

    Поиск файлов, имеющих подтвержденный дубликат в том же каталоге, рекурсивно

    Печать строки между двумя круглыми скобками

    Показать использование ядра ЦП для родительского процесса и его дочерних процессов

    UNIX переместить имя файла с помощью sysdate

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