我观察到 Ruby 命令行选项
-p
的不同行为,具体取决于它是否与管道一起使用。以下是两种情况:
不带管道:
ruby -pe 'puts "You said #{$_}"
时,它似乎只是在puts
打印之后输出输入原样。
带管:
echo "hello world" | ruby -pe '$_.upcase!
中的管道会导致预期的转换,打印大写的“HELLO WORLD”。有人可以解释为什么这两种情况之间的行为存在差异吗?
-p
选项在每种情况下与输入的交互是否不同?
仅供参考。结果如下。
$ echo "hello world" | ruby -pe '$_.upcase!'
HELLO WORLD
$ ruby -pe 'puts "You said #{$_}"'
1
You said 1
1
...
根据
-p
手册页,ruby(1)
标志将“在循环的每一端打印变量 $_
的值”。在您使用管道的示例中,这正如您所期望的那样工作:使用 upcase!
将替换 $_
的值,然后 Ruby 会将其打印出来。
但是,在没有管道的示例中,您使用
puts
显式打印出字符串,这会发生 另外 到 -p
行为。使用第一个示例(带管道和不带管道)的工作方式相同:
$ ruby -pe '$_.upcase!'
aa
AA
$ echo "aa" | ruby -pe '$_.upcase!'
AA
您还可以使用
-n
标志,其作用与 -p
相同,但不会自动打印出任何内容。例如:
$ ruby -ne 'puts "You said #{$_}"'
aa
You said aa
bb
You said bb
cc
You said cc