当我这样做时:
$ /bin/echo 123 | /bin/echo
我没有o / p。那是为什么?
答案 0 :(得分:6)
你问为什么它不起作用。事实上,它确实有效;它完全按照你的要求去做。显然这不是你所期望的。我认为您希望它打印123
,但您实际上并没有这么说。
(注意:“stdin”是标准输入;“stdout”是标准输出。)
/bin/echo 123 | /bin/echo
这是发生了什么。使用参数echo
执行123
命令。它将“123”,后跟换行符写入其标准输出。
stdout通过管道(|
)重定向到第二个echo
命令的stdin。由于echo命令忽略了它的标准输入,因此静静地丢弃第一个回声的输出。由于您没有给第二个echo命令任何参数,因此它不会打印任何内容。 (实际上,没有参数的/ bin / echo通常会打印一个空行;你看到了吗?)
通常,管道(|
)与过滤器一起使用,这些程序从stdin读取并写入stdout。 cat
可能是最简单的过滤器;它只读取其输入并将其保持不变地写入其输出(这意味着some-command | cat
可以写为some-command
)。
非平凡过滤器的示例是rev
,它将stdin复制到stdout,同时反转每行中的字符。
echo 123 | rev
打印
321
rev
是一个过滤器; echo
不是。 echo
会打印到stdout,所以将它放在管道的左侧是有意义的,但它不会从stdin中读取,因此在右侧使用它是没有意义的。管。
答案 1 :(得分:5)
“echo”从命令行读取,而不是标准输入。所以管道在这里不起作用。
来自bash手册:
echo [-neE] [arg ...]
Output the args, separated by spaces, terminated with a newline.
所以你的第一个回声确实打印“123”表示输出,但是,第二个回声没有使用它,所以“123”被删除。然后打印一个空行,就好像你运行“echo”一样。
你可以使用cat作为Keith Thompson的建议:
echo 123|cat
答案 2 :(得分:0)
/bin/echo 123 < /bin/echo
pipe = concat
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-4.html
管道允许您使用程序的输出作为另一个程序的输入