• ベストアンサー

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

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

noname#9431
noname#9431
  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • echoの出力は標準エラー出力ですか?

    例えばsamp.cshのようなc-shellスクリプトを作成、 samp.csh | less のようにすると、echoの行が表示されないのに対して samp.csh |& less とすると表示されました。 echoは例によって色々なバージョンがありそうですが、man を見る限りechoの出力に関して特別な記述が有りません。 echo is a shell built-in /usr/local/bin/echo /bin/echo /usr/bin/echo /usr/ucb/echo echoコマンドはデフォルトで標準エラー出力なのでしょうか?これを標準出力にするオプションは無いのでしょうか?もしくはどのエコーを使うと解決するのでしょうか? --[samp.csh] #! /bin/csh -f foreach a ($aa) echo "$a" diff $work/$a $TRY1_CENTER/syn/ end システム Release: 5.7 Kernel architecture: sun4u Application architecture: sparc Kernel version: SunOS 5.7 Generic 106541-17 June 2001

  • ActivePerlで#!/usr/bin/が無効

    WindowsXPにActivePerl(5.16.3.1603)をインストールして、 コマンドラインに「perl script.scr」と入力して スクリプトファイルは実行できるのですが、 スクリプトファイルの1行目に「#!/usr/bin/perl」を記述して、 コマンドラインに「script.scr」と入力して実行しようとすると、 「C:\・・・\script.scrは有効なWin32アプリケーションではありません。」 というメッセージが表示されて正しく実行できません。 perl.exeのあるフォルダをC:\usr\binフォルダにして、 1行目を #!/usr/bin/perl #!C:/usr/bin/perl #!C:\usr\bin\perl などいろいろ試してみましたが、どれも 前述のメッセージが表示されて実行できませんでした。 コマンドラインに「script.scr」と入力するだけで 実行することができるようにするには どのようにすればいいのでしょうか。 script.scrの拡張子scrをplなどに変更して この拡張子のファイルに対してperl.exeに関連付けることにより script.plだけでも実行できるようにはなりますが 拡張子.scrではこの関連付けができませんので #!/usr/bin/perl等を使用する方法で解決したいです。 ジャンクションとかApacheなどが全く分かりませんので これらを使わずに簡単にできる方法がありましたら教えてください。 (なお使っても分かりやすい手順があれば可です) よろしくお願いします。

    • ベストアンサー
    • Perl
  • ニフティでメールフォームを使用する方法

    ニフティの無料HPサービスでメールフォームを使いたいのですがsendmailが使えません。 以下の説明書きがありましたが、シェルスクリプトは知識がなく、ちょっと困っています。 シェルスクリプトでも可能なものなんでしょうか? ---------------------------------------------- perlについて perlのバージョンは5です。 (ただし、perl5での標準的なモジュールは使用できません) パスは、「/usr/local/bin/perl」となります。 スクリプトの1行目は「#!/usr/local/bin/perl」と記述してください。 シェルスクリプト(sh)について シェルスクリプト(sh)に関しては、以下のコマンドがご利用可能となっております。 awk, chmod, date, egrep, expr, grep, mkdir, rmdir, sh, cat, cp, echo, env, find, ls, mv, rm, sed なお、sendmailはご利用いただけません。 --------------------------------------------------

    • ベストアンサー
    • CGI
  • perlの起動法

    perl起動法について質問なのですが、 perlでファイルを作り、一番上に#!/usr/bin/perlと書いて、perl.plという名前で保存しました。 ターミナルで$chmod 755 perl.pl $./perl.pl とコマンドをうったのですが、print文で書いたhello worldというが表示されません。 でもperl perl.plとコマンドを打つと実行されます。 一体この違いはなんなのでしょうか?学校の課題で、どうしても./perl.plとして実行させなければならないので是非解答お願いします。

    • ベストアンサー
    • Perl
  • JSPでのincludeについて

    JSPからincludeでperlを呼び出したのですが、 perlのファイル内で記載したスクリプトがそのまま文字列として表示されてしまいます。 なにか設定する必要があるのでしょうか。 コマンドから直接perlを実行した場合は期待する結果が返ってくることが確認できました。 --------------------------------------------- ■test.jsp // perlを呼び出し <jsp:include page="test.pl" flush="true"></jsp:include> ■test.pl #!/usr/bin/perl print $result; exit; ■test.jspで表示される結果 #!/usr/bin/perl print "aaaaaaaaaaaaaaaa"; exit; ■期待する結果 aaaaaaaaaaaaaaaa --------------------------------------------- よろしくお願いします。

  • 困ってます Cygwin で ls が実行できません

    はじめまして、勉強のために Cygwin をダウンロードしました。 しかし、実行できるコマンドとできないコマンドがあって困っています。 とりあえず例をあげますと、cd, pwd は動いて、ls は動きません。 なぜか ls.exe だと動きます。(オプションもOK) 以下にその bash のコマンド実行画面をコピペします。ユーザ名だけ隠させていただきます。 bash-3.2$ pwd /cygdrive/c/usr/ユーザ名 bash-3.2$ ls ls: invalid option -- Try `ls --help' for more informati bash-3.2$ ls.exe kterm.exe work bash-3.2$ cd work/ bash-3.2$ pwd /cygdrive/c/usr/ユーザ名/work ------------------------------- Cygwin を C:\cygwin にダウンロード後にしたことは3つです。 1.Windows の 環境変数 に HOME : C:\usr\ユーザ名 と   Path : C:\cygwin\bin;C:\cygwin\usr\local\bin; を追加。 2.bash の作業ディレクトリを C:\usr\ユーザ名 に設定。 3.C:\usr\ユーザ名 に .bashrc などを設置。 といった所だと思います。覚えていないだけかもしれませんが。 以上、よろしくお願いします。

  • ドットを含まないファイルの表示

    ドットを含まないファイルをperlで表示したいのですが、 うまくいきません。 シェル上から「ls | grep -v "\."」を実行すれば、 意図した結果は得られています。 しかし、perl上で動作させると、何も表示されません。 #! /usr/bin/perl chdir("/tmp"); open(DIR_IN, "ls -l | grep -v '\.' 2> /dev/null |"); while($file=<DIR_IN>) { print $file; }

    • ベストアンサー
    • Perl
  • bad interpreter:エラーについて

    -bash: ./test.pl: usr/bin/perl: bad interpreter: というエラーについてです。 掲題のエラーが出てしまい、perlが動かないので困っています。 どうすればいいのか教えてもらえませんでしょうか。 【状況】 VMwareplayer3.1.2上で、CentOS5.5を動かし、デフォルトで入っているperlを使ったファイル「test.pl」を作っています。 test.plを実行しようとしているのですが、以下のエラーメッセージが表示されます。 -bash: ./test.pl: usr/bin/perl: bad interpreter: そのようなファイルやディレクトリはありません 実行した際のコマンドは./test.plです。 test.plの中身は以下。 ------------------------------------------------------ #!/usr/bin/perl use strict; use warnings; my $name = "morifuji"; print "Hello ". $name . "\n"; ------------------------------------------------------ 【確認済み事項】  test.plの置き場所は/usr/bin/perlです。  ls -lで権限をみたところ、rwxr-xr-x furukawa root 4096となっている。  perl test.plと命令するとエラーは返らずちゃんと表示されます。  (perlを省いて、test.plと命令するとエラーになる。これだと、webから表示されたときに動きません)  FTPとかで転送すると文字コードの問題でバグが出る、という風な記事を見かけたが、VMwarePlayerなのでそういったやりかたはしていない。  which perlと命令してperlの場所を探したが、 /usr/bin/ にある。

  • gcc@MinGW:外部コマンドの起動

    MSYS2/MinGW64 on Windows10 の環境で gcc 開発をしています。 下記の簡単なソースを用意します。 #include <stdio.h> #include <stdlib.h> void main() { system("/usr/bin/ls"); exit(0); } なお、/usr/bin/ls の存在は、   $ which ls ↓   /usr/bin/ls にて確認しています。 これを /mingw64/bin/gcc でコンパイルして実行すると、 '/usr/bin/ls' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示され、明らかに存在するはずの ls コマンドが起動されません(上記エラーメッセージ中のマルチバイト文字はなぜか cp932 で表示されています)。 ところが、同じソースを /usr/bin/gcc でコンパイルすると、問題なく実行されるのです。 MSYS2 と MinGW の関係がよく理解できていないこともあり、どうしてこのようなことが起こるのか理解に苦しんでいます。 どなたかお心当りのあるかた、お教え下されば幸いです。

  • use strictが効かない (PERL)

    たびたびお世話になっております。 PERL version 5.14.2 をWindows 7 のコマンドプロンプトから起動して使っています。 use strict; と一行目に書くと 宣言されていない変数があれば拒絶されるとのことで #!/usr/bin/perl use strict; use warnings; $a = 10; print "$a\n"; というスクリプトを書きました。が、すんなり動いてしまいます。 use strict; は どうすればうまく効くのでしょうか。 ご指導お願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう