26

私は Perl を初めて使用するのでprg、次のシナリオで外部コマンドを実行する方法 ( と呼びます)を知りたいです。

  1. を実行prgし、そのstdout唯一のものを取得します。
  2. を実行prgし、そのstderr唯一のものを取得します。
  3. を実行prgし、そのstdoutstderrを別々に取得します。
4

4 に答える 4

38

バックティックを使用して外部プログラムを実行し、そのstdoutとをキャプチャできますstderr

デフォルトでは、バッククォートは を破棄し、外部プログラムのstderrのみを返します。stdout

$output = `cmd`;

プログラムの cmd をキャプチャし、stdout破棄しstderrます。

キャプチャのみstderrを行うには、シェルのファイル記述子を次のように使用できます。

$output = `cmd 2>&1 1>/dev/null`;

両方をキャプチャするにはstdout、次のstderrことができます。

$output = `cmd 2>&1`;

stderr上記を使用すると、 と区別できなくなりますstdoutstdout分離するには、両方を別のファイルにリダイレクトしstderrてファイルを読み取ることができます。

`cmd 1>stdout.txt 2>stderr.txt`;
于 2010-03-17T10:42:40.180 に答える
10

ほとんどの場合、qx//演算子(またはバックティック)を使用できます。文字列を補間し、シェルで実行するため、リダイレクトを使用できます。

  • コマンドのSTDOUTをキャプチャするには(STDERRは影響を受けません):

    $output = `cmd`;
    
  • コマンドのSTDERRとSTDOUTを一緒にキャプチャするには:

    $output = `cmd 2>&1`;
    
  • コマンドのSTDERRをキャプチャし、そのSTDOUTを破棄するには(ここでは順序付けが重要です)。

    $output = `cmd 2>&1 1>/dev/null`;
    
  • STDERRをキャプチャするためにコマンドのSTDOUTとSTDERRを交換しますが、そのSTDOUTを残して古いSTDERRを出力するには:

    $output = `cmd 3>&1 1>&2 2>&3 3>&-`;
    
  • コマンドのSTDOUTとそのSTDERRの両方を別々に読み取るには、それらを別々にファイルにリダイレクトし、プログラムの完了時にそれらのファイルから読み取るのが最も簡単です。

    system("program args 1>program.stdout 2>program.stderr");
    
于 2010-03-17T10:49:53.103 に答える
10

IPC::Open3またはIPC::Runを使用できます。また、perlfaq8の外部コマンドからSTDERRをキャプチャする方法もお読みください。

于 2010-03-17T11:05:54.710 に答える