cat - | tr "a-z" "A-Z" | tr "A-Z" "a-z"
当我在bash shell提示符下运行时,不会给出任何输出。我必须按Ctrl-D才能获得o / p。
o / p
$ cat - | tr "a-z" "A-Z" | tr "A-Z" "a-z"
this is a test
然而这很好用,我不使用Ctrl-D得到输出。为什么?
cat - | tr "a-z" "A-Z"
O / P
$ cat - | tr "a-z" "A-Z"
this is a test
THIS IS A TEST
cat "$@" | tr "a-z" "A-Z" | tr "A-Z" "a-z"
当我在bash shell提示符下运行它时,挂起。那是为什么?
我的$@
为空。
然而,这就像这样
cat "$@" | tr "a-z" "A-Z"
答案 0 :(得分:3)
如果$@
为空,cat
将等待stdin上的输入,当你从shell提示符运行它时绑定到你的tty。键入ctrl-D(表示文件结尾),然后您将返回到提示符。
在脚本中,$@
可能会扩展为文件名,因此行为不同。
答案 1 :(得分:2)
你所看到的是缓冲。在
cat - | tr a-z A-Z | tr A-Z a-z
(不需要引号)点击后可能无法立即获得输出
输入,因为中间或第三个tr
可能已缓冲数据
内部。在某些时候,他们会冲洗他们的缓冲区,你会得到
完整,正确的输出。按Ctrl-D可关闭管道并强制刷新。
将多个命令连接在一起时,这是一种相当典型的现象 管。
顺便说一句,在这个的情况下(但不是在使用“$ @”时),cat -
是多余的。