Как работает команда piping в * NIX? - PullRequest
5 голосов
/ 19 февраля 2009

Когда я делаю это:

find . -name "pattern" | grep "another-pattern"

Являются ли процессы, find и grep, порожденными вместе? Я думаю, да. Если так, то как это работает?:

yes | command_that_prompts_for_confirmations

Если yes постоянно отправляет 'y' на стандартный вывод и command_that_prompts_for_confirmations читает 'y', когда читает свой стандартный ввод, как yes узнает, когда завершить работу? Потому что, если я запускаю yes в одиночку, не передавая свои выходные данные какой-либо другой команде, это никогда не заканчивается.

Но если команды конвейера не порождают все процессы одновременно, тогда как yes узнает, сколько у вас нужно вывести? Это ловушка-22 для меня здесь. Может кто-нибудь объяснить мне, как этот трубопровод работает в * NIX?

Ответы [ 4 ]

11 голосов
/ 19 февраля 2009

С на странице википедии : "Команда yes сама выводит 'y' или любое другое, указанное в качестве аргумента, за которым следует новая строка до тех пор, пока пользователь не остановится или не уничтожится иным образом; при передаче в команду она будет продолжаться до тех пор, пока не прервется конвейер (т. е. программа завершит свое выполнение). "

yes не «знает», когда прекратить. Однако в какой-то момент вывод «y» в stdout вызовет ошибку, потому что завершился другой процесс, что приведет к разрыву канала и завершению yes.

Последовательность:

  1. другая программа завершает работу
  2. операционная система закрывает трубу
  3. yes пытается вывести символ
  4. ошибка происходит (сломанная труба)
  5. да заканчивается
5 голосов
/ 19 февраля 2009

Да, (вообще говоря) все процессы в конвейере порождаются вместе. Что касается yes и подобных ситуаций, сигнал передается обратно по конвейеру, чтобы указать, что он больше не принимает ввод. В частности: SIGPIPE, подробности здесь и здесь . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

Вы можете увидеть SIGPIPE в действии, если прервете команду, которая не ожидает этого, так как вы получите ошибку Broken Pipe. Кажется, я не могу найти пример, который делает это на моей голове в настройках Ubuntu.

4 голосов
/ 19 февраля 2009

Другие ответы покрыли завершение. Другим аспектом является то, что yes выдаст только ограниченное число y - в канале есть буфер, и как только он заполнится, yes заблокирует запрос на запись. Таким образом, да не потребляет бесконечное время процессора.

3 голосов
/ 19 февраля 2009

Стандартный вывод первого процесса связан со стандартным вводом второго процесса и так далее по линии. "yes" завершается, когда второй процесс завершен, потому что у него больше нет стандартного вывода для записи.

...