Techioz Blog

パイプを使用した場合と使用しない場合の Ruby CLI オプションの動作の不一致

概要

Ruby のコマンドライン オプション -p がパイプの有無に応じて異なる動作を観察しています。以下に 2 つのシナリオがあります。

パイプなし:

パイプあり:

これら 2 つのシナリオで動作に違いがある理由を誰かが説明できますか? -p オプションは、それぞれのケースで入力と異なる方法で対話しますか?

ご参考までに。結果は以下の通りです。

$ echo "hello world" | ruby -pe '$_.upcase!'
HELLO WORLD
$ ruby -pe 'puts "You said #{$_}"'
1
You said 1
1
...

解決策

Ruby(1) のマニュアルページによると、-p フラグは「ループの両端で変数 sh の値を出力する」とのことです。パイプを使用した例では、大文字を使用して期待どおりに機能しています。は sh の値を置き換え、Ruby は後でそれを出力します。

ただし、パイプのない例では、 -p の動作に加えて、 put を使用して文字列を明示的に出力しています。最初の例をパイプを使用しても使用しなくても、同じように動作します。

$ 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