2009-03-06 7 views
2

なぜこの行は "?"ではなく "z"を出力するのですか?Rubyで疑問符が "z"と解釈される理由

$ルビー-e 'がX%を置く[#エコー{ "?"}]'

#{...}内の式は、 "?" の値を有することができる変数であると仮定する。 "z"の代わりに疑問符が出力されるようにこのスクリプトをどのように修正する必要がありますか?

(この質問のタイトルを許してください - 。私はまだ、より説明的なタイトルを提供するのに十分なだけでなく、ここで何が起こっているか理解していない)

+0

これはどのOSですか?私はWindows上で再現することはできません、あなたのシェルが何かファンキーなことをしているのだろうかと思います。 – AShelly

答えて

1

それはないですか?

irb(main):001:0> puts %x[echo #{"?"}] 
? 
=> nil 

#{}を使用すると、内部のあなたのすべての変数の値を与えるだろう - あなたは

puts %x[echo "?"] 

か、単に

puts '?' 
7

するのではなく、それを使っている理由は、私はわからないんだけどそれはルビーではなく、あなたのシェルです。

多くのシェルは?コマンドライン引数の1文字と一致する文字。 それは便利です、あなたはファイルの束を持っている場合TEMPA、TEMP1、TEMPB、...、削除したいtemp9に名前を付けていますが、削除したくない「寺」

% rm temp? 

だから私は」あなたの作業ディレクトリに 'z'という名前のファイルまたはディレクトリがありますか?それにマッチするので、シェルに置き換えられます。

通常、(あなたのルビースクリプトのように)一重引用符で囲まれていると、展開されませんが、疑問符をシェルコマンドに渡すので、そこに展開されます。

% ruby -e 'puts %x[ echo ? ]' 
z 
% 

同じ動作を表示する必要があります。

あなたはABCDのようなカップルの他の単一の文字のファイル名に触れる場合も、それらがあまりにも表示されるはずです:

% touch a b c 
% ruby -e 'puts %x[ echo ? ]' 
a b c z 
% 

あなたはルビー内から外部のシェルコマンドを呼び出すときに、これを避けたい場合は、あなたが持っているでしょうあなたが渡した弦をエスケープする。ほとんどの目的のために、String#inspectは十分なエスケープを与えるべきです。