Оболочки труб - порядок вещей

Так как netcat на моей коробке не поддерживает -e, netcat Страница man дает мне этот обходной путь:

$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

Я не понимаю, как это работает. Я думаю, что когда вы пытаетесь cat /tmp/f что это будет блокировать, пока что-то не написано /tmp/f и если он заблокирован, как выполняется остальная часть команды?

1 ответ

Решение

Все команды в конвейере запускаются одновременно и выполняются одновременно - команда 2 не ожидает выхода команды 1. Вместо этого конвейеры полагаются на блокировку операций чтения до тех пор, пока предыдущая команда не выдаст какой-либо вывод.

Например, вывод (stdout) cat /tmp/f непосредственно1 подключен к входу /bin/sh -i; всякий раз, когда sh пытается читать с его стандартного ввода, он блокируется, пока cat не выдаст какой-либо вывод.


1 (почти напрямую; stdout cat и std sh привязаны к двум концам объекта 'pipe'.)

Другие вопросы по тегам