разница между конвейерной передачей и перенаправлением в Linux - PullRequest
8 голосов
/ 27 апреля 2011

Может кто-нибудь сказать мне разницу?например:
если у меня есть файл a.txt со следующим содержимым:

a
b
c

что будетразница между cat a.txt | cat и cat < a.txt
Мне кажется, что все они имитируют STDIN, это правильно, или есть различия?Большое спасибо.

Ответы [ 3 ]

11 голосов
/ 27 апреля 2011

Трубопровод работает от одного процесса к другому (cat s в первом примере) и, следовательно, требует взаимодействия двух процессов. Перенаправление обрабатывается самой оболочкой. Это может иметь значение при выполнении таких действий в оболочке, как работа с переменными .

3 голосов
/ 27 апреля 2011

Перенаправление не "имитирует STDIN".При перенаправлении файл является стандартным для процесса.В частности, многие программы ведут себя по-разному, если ввод является обычным файлом, чем если это труба или tty, поэтому вы можете получить другое поведение.Например:

$ < file perl -E 'say "is a regular file" if -f STDIN'
is a regular file
$ cat file | perl -E 'say "is a regular file" if -f STDIN'
1 голос
/ 22 августа 2017

Во-первых, два результата совпадают.Нечего сказать.

Для принципа работы cat a.txt | cat первый кот принимает аргумент a.txt, а затем печатает его содержимое.Вы передаете stdout первого значения на stdin второго.Второй cat не находит аргумента, поэтому читает содержимое из stdin и печатает его.

Поскольку вы используете < во второй команде, система заменяет stdin из cat потоком файлаa.txt.Все остальное так же, как второй кот в первом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...