使用和不使用管道时 Ruby CLI 选项 `-p` 行为的差异

问题描述 投票:0回答:1

我观察到 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
...
ruby command-line-interface
1个回答
0
投票

根据

-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
© www.soinside.com 2019 - 2024. All rights reserved.