Существует сильная синтаксическая разница между двумя:
Переадресация - это аргумент для программы. A pipe разделяет две команды. Вы можете думать о таких переадресациях: cat [<infile] [>outfile] , Это означает, что порядок не имеет значения: cat <infile >outfile совпадает с cat >outfile <infile. Вы даже можете смешивать перенаправления с другими аргументами: cat >outfile <infile -b и cat <infile -b >outfile оба прекрасно подходят. Также вы можете объединять более одного входа или выхода (входы будут считываться последовательно, и все выходные данные будут записываться в каждый выходной файл): cat >outfile1 >outfile2 <infile1 <infile2. Целью или источником перенаправления может быть либо имя файла, либо имя потока (например, 1, по крайней мере, в bash).
Но трубы полностью разделяют одну команду из другой команды, t смешивать их с аргументами:
[command1] | [command2]
Труба берет все, что записано на стандартный вывод из команды1, и отправляет его на стандартный ввод команды2.
Вы также можете комбинировать трубопроводы и перенаправление. Например:
cat <infile >outfile | cat <infile2 >outfile2
Первый cat будет читать строки из infile, затем одновременно записывать каждую строку в outfile и отправлять ее ко второму cat.
В второй cat, стандартный ввод сначала считывается из трубы (содержимое infile), затем считывается из infile2, записывая каждую строку в outfile2. После выполнения этого outfile будет копией infile, а outfile2 будет содержать infile, за которым следует infile2.
Наконец, вы действительно делаете что-то действительно похожее на ваш пример, используя перенаправление «здесь строки» (только для семейства bash) и backticks:
grep blah <<<`ls`
даст тот же результат, что и
ls | grep blah
Но я думаю, что версия перенаправления сначала будет считывать весь вывод ls в буфер (в памяти ), а затем подайте этот буфер на grep по одной строке за раз, тогда как версия с каналами будет принимать каждую строку от ls по мере ее появления и передать эту строку grep.