Почему эта эхо-конструкция не работает? - PullRequest
4 голосов
/ 19 августа 2011

Когда я делаю это:

$ /bin/echo 123 | /bin/echo

Я не получаю o / p.Почему это так?

Ответы [ 3 ]

6 голосов
/ 19 августа 2011

Вы спрашиваете, почему это не работает.На самом деле, это работает;он делает именно то, что вы сказали.Видимо, это не то, что вы ожидали.Я думаю, вы ожидали, что он напечатает 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 печатает на стандартный вывод, поэтому имеет смысл располагать его на левой стороне канала, но он не читает на стандартном вводе, поэтому нет смысла использовать его на правой стороне канала.

5 голосов
/ 19 августа 2011

«Эхо» читает из командной строки, не стандартный ввод. Так что трубопровод здесь не работает.

Из руководства по bash:

echo [-neE] [arg ...]

Output the args, separated by spaces, terminated with a newline.

Таким образом, ваше первое эхо напечатало «123» для вывода вывода, однако второе эхо не использовало его, поэтому «123» отбрасывается. Затем выводится пустая строка, как будто вы запускаете «echo».

Вы можете использовать кошку, как предложил Кит Томпсон:

echo 123|cat
0 голосов
/ 19 августа 2011
/bin/echo 123 < /bin/echo

pipe = concate

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-4.html

Трубы позволяют использовать выходные данные программы в качестве входных данных для другой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...