Вы спрашиваете, почему это не работает.На самом деле, это работает;он делает именно то, что вы сказали.Видимо, это не то, что вы ожидали.Я думаю, вы ожидали, что он напечатает 123
, но на самом деле вы этого не сказали.
(Примечание: «stdin» - стандартный ввод; «stdout» - стандартный вывод.)
/bin/echo 123 | /bin/echo
Вот что происходит.Команда echo
выполняется с аргументом 123
.Он записывает «123», за которым следует символ новой строки, в свой стандартный вывод.
Стандартный вывод перенаправляется через канал (|
) на стандартный ввод второй команды echo
.Так как команда echo игнорирует свой стандартный ввод, вывод первого эха незаметно отбрасывается.Поскольку вы не дали второй команде echo никаких аргументов, она ничего не печатает.(На самом деле / bin / echo без аргументов обычно печатает одну пустую строку; вы видели это?)
Обычно каналы (|
) используются с фильтрами , программами, которые читаютиз стандартного ввода и напишите в стандартный вывод.cat
, вероятно, самый простой фильтр;он просто читает свой ввод и записывает его без изменений в свой вывод (что означает, что some-command | cat
может быть записано как просто some-command
).
Примером нетривиального фильтра является rev
,который копирует стандартный ввод в стандартный вывод при обращении символов в каждой строке.
echo 123 | rev
печать
321
rev
- фильтр;echo
нет.echo
печатает на стандартный вывод, поэтому имеет смысл располагать его на левой стороне канала, но он не читает на стандартном вводе, поэтому нет смысла использовать его на правой стороне канала.