
Я пытаюсь глубже понять конвейеризацию и перенаправление. В каждом руководстве говорится, что в cmd1 | cmd2
cmd1 будет выполнено, а stdout будет совместно использоваться со stdin cmd2. Но это не очень хорошо укладывается в моей голове, поэтому я проверил:
Так что похоже, что и ./test.shиgrep запущены впараллельно!
Вот исходный код:
#!/bin/bash
a=0
while :
do
((a=a+1))
echo "Line number $a"
sleep 1
done
Попытка использовать его с разными рекомендациями дает схожие результаты. Трубы идут параллельно?
Как работают конвейер и перенаправление «под капотом»?
решение1
Да, все команды выполняются одновременно. В вашем случае запускается grep
одновременно с test.sh
, но поскольку он считывает свой stdin, он блокируется до тех пор, пока не test.sh
поместит в него что-то, что не произойдет одновременно. Два процесса следуют друг за другом, если второй медленный, первый заполнит свой выходной буфер stdout и будет вынужден ждать, пока второй не прочитает что-то. Если первый медленный, второй блокируется, пока он считывает ввод, если его нет.
В реальной жизни stdout первого процесса записывается довольно большими кусками (около 4К)(*), поэтому второму процессу нечего читать, пока первый процесс не запишет данные по крайней мере на 4К. Ваше test.sh
использование echo
может немного отличаться и делать вывод с буферизацией строк.
(*) Правило заключается в том, что если вывод осуществляется на "tty" (т.е. терминал), он буферизуется построчно: LF в выводе вызывает фактический вывод. В противном случае он буферизуется блоками по 4 КБ. Первый процесс также может явно подавить всю буферизацию, но это плохо для производительности.
решение2
На самом деле вы смотрите на то, что называется flow control
, и/или (пере)направлением -- снова; flow control
, или stdin
, stdout
(стандартный вход / стандартный выход).
Надеюсь, мое утверждение выше поможет вам лучше понять, чтонамеревалсяпроизойти, и что вы можете лучшеожидать.
трубка, или "трубопровод" stdout
, простонаправляет stdout
в большинстве случаев.
Параллельно этоДействительнодругое название длятандем. Ты можешьпытатьсядля запуска 2 разных/одинаковых команд/выводов одновременно. Но ожидаясинхронизированныйбежать было бы неразумно, так как это маловероятно.
К вашему примеру; Здесь вы представляете то, что называетсяусловный. Примерно то же самое, что дорожный знак или светофор. Этиусловный(с)прямой потокоснованный насостояние. В вашем примерепока"состояние" --пока этот, делатьчто. Условия в целомперенаправить stdin
, stdout
.
В прямом ответе на ваши 2 прямых вопроса
- Труба идет параллельно?
Нет, не обязательно. По крайней мере, не внормальныйчувство «параллельности» (тандема).
Но pipe
можетогонь (инициировать) 2рабочие местав то же время. Дажетакой жеработадважды.
- Как работают конвейер и перенаправление «под капотом»?
Надеюсь, я лучше проиллюстрировал это выше. :)
или
cat ./ASCII | grep somename >./output
Вышеизложенное cat ./ASCII
являетсявыход( stdout
). Который становитсявход( stdin
) посредствомтрубка( |
) для grep somename
. Что является(пере)направленный( >
) к его окончательному результату ./output
.