В чем разница между pipeопроводом и перенаправлением?
Где мы должны использовать pipeопровод и где мы должны использовать перенаправление?
Как они внутренне работают?
В чем разница между pipeопроводом и перенаправлением?
Где мы должны использовать pipeопровод и где мы должны использовать перенаправление?
Как они внутренне работают?
Перенаправление (в основном) для файлов (вы перенаправляете потоки в/из файлов).
Трубопровод предназначен для процессов: вы пересылаете (перенаправляете) потоки из одного процесса в другой.
По существу, вы действительно "подключаете" один стандартный поток (обычно stdout
) одного процесса к стандартным потокам другого процесса (обычно stdin
) через канал.
Трубы также имеют синхронизацию "побочный эффект": они блокируют один процесс (при чтении), когда другому нечего писать (пока), или когда процесс чтения не может читать достаточно быстро (когда буфер буфера заполнен).
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"
Что касается того, как они работают внутри, я только сейчас изучаю это свое "я". Но я нашел эту ссылку, которая предлагает некоторое обсуждение.
Вы должны использовать трубопровод, если хотите передавать выходные данные между программами; используйте перенаправление, если вы хотите записать в файл.
В основном переадресация и протоколы являются несколькими способами среди многих, чтобы достичь взаимодействия Inter Process в Unix.
ls > FileName
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:
Перенаправление: отправьте вывод (stdout
и/или stderr
) команды в файл
Пример: ls > your_file
записать результат списка каталогов в файл с именем your_file
Трубопровод: отправьте вывод другой команде. Пример ls | wc
отправьте тот же вывод (список каталогов) в команду wc
, которая подсчитывает символы.
Я заметил, что конвейерная обработка применяется к выходу замещения процесса, но не к перенаправлению:
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