Разница между трубопроводом и перенаправлением в Linux

StackOverflow https://stackoverflow.com/questions/5802879

  •  24-10-2019
  •  | 
  •  

Вопрос

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

а
беременный
в

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

Это было полезно?

Решение

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

Другие советы

Перенаправление не «моделирует stdin». Когда вы перенаправляете, файл является 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'

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top