Подтвердить что ты не робот

Трубопроводы и перенаправление

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Например:

ls * | grep "name"

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

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

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

ls * > file
grep "name" file

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

ls * | grep "name"

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

Как работает Piping в Linux?

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

Ответ 3

В основном переадресация и протоколы являются несколькими способами среди многих, чтобы достичь взаимодействия Inter Process в Unix.

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

ls > FileName

  1. Трубопровод. Трубопровод - это процесс, в котором вывод одного процесса делается вводом другого. Они развивались в самых примитивных формах операционной системы Unix. Они обеспечивают однонаправленный поток связи между процессами в рамках одной и той же системы. Труба создается путем вызова системного вызова pipe, который создает пару дескрипторов файлов. [Для дескрипторов файлов читайте 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. Оправа

Ответ 4

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

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

Ответ 5

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

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