Почему этот сценарий не работает?
#!/bin/bash rm out mkfifo out nc -l 8080 < out | while read line do echo hello > out echo $line done
Если я перейду к IP-адресу машины, на которой работает этот скрипт (с использованием порта 8080), я ожидаю увидеть слово «привет», а затем на машине, на которой запущен скрипт, я ожидаю, что он выведет строки из запроса.
Однако ничего не происходит. Браузер не получает ответа, и ничего не выводится на терминал сервера.
- вращать элемент массива в сценарии оболочки
- Сценарий в cron не может найти команду
- Строки из двух разных массивов не совпадают?
- Какова функция этого «user user @ domain где угодно» в автоматическом скрипте ftp?
- Самый короткий способ извлечь последние 3 символа базы (минус суффикс) filename
Почему он не работает, и что я могу изменить, чтобы заставить его работать? Я хочу держать его в простых трубах, я не хочу использовать замену процесса или что-то в этом роде.
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 }