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

301
Drew LeSueur

Поскольку netcatна моем ящике не поддерживается -e, netcatстраница руководства дает мне этот обходной путь:

$ 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и если это заблокировано, как будет выполняться остальная часть команды?

2

1 ответ на вопрос

3
grawity

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

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


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

Ого, чем больше я изучаю bash / shell, тем больше это меня впечатляет. Спасибо. Drew LeSueur 6 лет назад 0

Похожие вопросы