• ベストアンサー

`ls`標準出力はどこにいった?

質問が続いて恐縮なのですが、お願いします。 perlスクリプトでshellコマンドを呼び出したとき、 (以下、#!/usr/bin/perl は省略) $y=`ls`; print $y; では結果がターミナルに表示される print `ls`; でも表示される しかし、単に `ls` では何も表示されない。 `ls`; print $_; でも何も表示されない。 `ls [存在しないファイル]` では標準エラーが表示される。 いったい `ls` の標準出力はどこに格納されるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

\ が足りないからです. `...` では \ をエスケープするのに \\ としなければなりません. こんな感じ: #!/usr/bin/perl $x = `sed -n 's/a\\(X\\)b/\\1/p' test.txt`; print $x;

noname#9431
質問者

お礼

なるほど!わかりました! `...`は...を「そのまま」シェルに渡すと思いこんでいたのですが、私の解釈する「そのまま」とPerlが解釈する「そのまま」が違っていたのですね。 以下の例で納得できました。 ありがとうございました。 #!/usr/bin/perl $z="sed -n 's/a\(X\)b/\1/p' test.txt"; $zz="sed -n 's/a\\(X\\)b/\\1/p' test.txt"; $zzz='sed -n \'s/a\(X\)b/\1/p\' test.txt'; $x=`$z`; $xx=`$zz`; $xxx=`$zzz`; print "\$z = $z\n"; print "\$zz = $zz\n"; print "\$zzz = $zzz\n"; print "\$x = $x\n"; print "\$xx = $xx\n"; print "\$xxx = $xxx\n";

その他の回答 (1)

回答No.1

`ls`を評価(実行)するが、標準出力は破棄されるハズ。

noname#9431
質問者

お礼

ご回答ありがとうございます。 必ず破棄されるという決まりなら納得なのですが、さらにこまったことに、 $cat test.txt aXb のもとで、 sed -n 's/a\(X\)b/\1/p' test.txt では X と表示されるのに、 $cat test.pl #!/usr/bin/perl $x=`sed -n 's/a\(X\)b/\1/p' test.txt`; print $x; $ ./test.pl では何も表示されないというのは何故だ? という疑問が新たに沸いてまいりまして。。。 なぜ上のlsの場合は$yに代入できて、この場合は$xに代入できないなどということが起こり得るのでしょうか? この振舞いはどうやって説明されるのか御存じの方がおられましたら、ご教授下さい。

関連するQ&A