Как работают findf и printf при использовании каналов в скриптах bash - PullRequest
1 голос
/ 29 октября 2011

Предположим, я использую команду printf в команде поиска следующим образом:

     find ./folder -printf "%f\n" | other command which uses the result of printf

в другой части команды, у меня может быть сортировка или что-то подобное

что именно делает printf в этом случае? где он печатает имена файлов перед процессом в части после "|" случается

если я, например, сортирую имена файлов, он сначала отсортирует их, а затем распечатает их, отсортированные на мониторе, но до этого, как именно деталь после | получить файлы несортированными, чтобы отсортировать их? дает ли printf в этом случае имена файлов в качестве входных данных для части после | а затем часть после | печатает имена файлов, отсортированные в выводе?

извините за мой английский: (* ​​1010 *

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Ваша оболочка вызывает pipe(), которая создает два файловых дескриптора. Запись в один буфер данных в ядре, которые доступны для чтения другим. Затем он вызывает fork(), чтобы создать новый процесс для команды find. После fork() он закрывает stdout (всегда fd 1) и использует dup2() для копирования одного конца канала в stdout. Затем он использует exec() для запуска find (замена копии оболочки в подпроцессе на find). Когда find запускается, он просто печатает в stdout как обычно, но он унаследовал его от оболочки, которая сделала его конвейером. Тем временем оболочка делает то же самое для other command... с stdin, так что она создается с fd 0, подключенным к другому концу канала.

0 голосов
/ 29 октября 2011

Да, так работают трубы.Выход из первого процесса является входом для второго.С точки зрения реализации, оболочка создает сокет, который получает ввод от первого процесса со своего стандартного вывода и записывает вывод во второй процесс на его стандартном вводе.

... Возможно, вам следует прочитать введение вПрограммирование в оболочке Unix, если у вас есть вопросы такого типа.

...