猫不管道

时间:2011-04-12 00:41:39

标签: bash shell scripting

问题的修订版本:

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" 

2 个答案:

答案 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 -是多余的。