Трубопровод и перенаправление - PullRequest
25 голосов
/ 04 марта 2012

В чем разница между трубопроводом и перенаправлением?

Где мы должны использовать трубопровод и где мы должны использовать перенаправление?

Как они внутренне работают?

Ответы [ 5 ]

29 голосов
/ 04 марта 2012

Перенаправление (в основном) для файлов (вы перенаправляете потоки в / из файлов).

Трубопровод предназначен для процессов: вы перенаправляете (перенаправляете) потоки из одного процесса в другой.

По сути, вы действительно «подключаете» один стандартный поток (обычно stdout) одного процесса к стандартному потоку другого процесса (обычно stdin) через канал.

Трубы также имеют синхронизацию «побочный эффект»: они блокируют один процесс (при чтении), когда другому нечего писать (пока) или когда процесс чтения не может прочитать достаточно быстро (когда буфер канала заполнен).

8 голосов
/ 03 мая 2014

Piping направляет вывод программы в другую программу.

Например:

ls * | grep "name"

Передает имена всех файлов в текущем каталоге в grep. Переадресация направляет или добавляет вывод в файл.

ls * > file  # writes all file names in current directory to the "file"
ls * >> file # appends all files names in current directory to the "file"

Трубопровод избавляет вас от необходимости записи в файл, а затем чтения из файла для выполнения программы на выходе другой программы.

ls * > file
grep "name" file

эквивалентно

ls * | grep "name"

Что касается того, как они работают внутри, я только сейчас узнаю это. Но я нашел эту ссылку, которая предлагает некоторое обсуждение этого.

Как работает конвейер в Linux?

Вам следует использовать трубопровод, если вы хотите передавать результаты между программами; используйте перенаправление, если хотите записать в файл.

3 голосов
/ 21 мая 2015

По сути, перенаправление и конвейерная связь - это несколько способов достижения взаимодействия между процессами в Unix.

  1. Перенаправление : данные записываются и считываются из типичного файла UNIX. Любое количество процессов может взаимодействовать. это необходимо использовать при совместном использовании больших наборов данных.

ls > FileName

  1. Трубопровод : Трубопровод - это процесс, в котором выход одного процесса становится входом другого. Они развивались в самых примитивных формах операционной системы Unix. Они обеспечивают однонаправленный поток связи между процессами в одной системе. Канал создается путем вызова системного вызова канала, который создает пару файловых дескрипторов. [Для файловых дескрипторов прочитайте http://www.bottomupcs.com/file_descriptors.html]

ls | grep $myName

Работает с простым обменом данными, например, производителем и потребителем.

Сравнение свойств: Трубопровод всегда однонаправлен, в то время как перенаправление может использоваться для перенаправления ввода и вывода.

ls > grep myFileName [Перенаправление вывода первой команды на следующую] sort < fileName.txt [Перенаправление файла fileName.txt в качестве входных данных для сортировки команд]

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

sort < fileName.txt > sortNewFile.txt

В то время как Piping, это всегда вывод первой команды, переданной последней, и одновременной.

ls | grep myName | awk '{ print $NF }' [несколько трубопроводов в одном операторе]

Примечание 1: command > fileName. Если есть команда с именем fileName, это сделает использование перенаправления намного сложнее и более подвержено ошибкам. Сначала нужно проверить, есть ли команда с именем, например, файл назначения.

Другие способы достижения IPC в системе Unix:

  1. Именованная труба
  2. Сигнал
  3. Общая память
  4. Разъем
1 голос
/ 11 марта 2016

Я заметил, что конвейерная обработка применяется к выводу замещения процесса, но не перенаправлению:

bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) | cat > pipe
bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) > redirect
bash-3.2$ one
two

bash-3.2$ cat pipe
one
two
three
one
two
bash-3.2$ cat redirect
one
two
three
1 голос
/ 04 марта 2012

Перенаправление: отправить вывод (stdout и / или stderr) команды в файл Пример: ls > your_file записать результат листинга каталога в файл с именем your_file

Трубопровод: отправить вывод другой команде.Пример ls | wc отправляет тот же вывод (список каталогов) команде wc, которая считает символы.

...