Разница между трубопроводом и перенаправлением в Linux
-
24-10-2019 - |
Вопрос
Кто -нибудь может сказать мне разницу? Например:
Если у меня есть файл a.txt
со следующим контентом:
а
беременный
в
в чем будет разница между cat a.txt | cat
а также cat < a.txt
Мне кажется, что все они имитируют Stdin, это правильно, или есть различия? Большое спасибо.
Решение
Трубопровод работает от одного процесса к другому ( cat
S в первом примере) и, следовательно, требует двух процессов, сотрудничающих. Пере перенаправление обрабатывается самой оболочкой. Это может иметь значение, когда делаете вещи в оболочке, например Работа с переменными.
Другие советы
Перенаправление не «моделирует 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
. Анкет Все остальное такое же, как у второй кошки в первом случае.