私は Perl を初めて使用するのでprg
、次のシナリオで外部コマンドを実行する方法 ( と呼びます)を知りたいです。
- を実行
prg
し、そのstdout
唯一のものを取得します。 - を実行
prg
し、そのstderr
唯一のものを取得します。 - を実行
prg
し、そのstdout
とstderr
を別々に取得します。
バックティックを使用して外部プログラムを実行し、そのstdout
とをキャプチャできますstderr
。
デフォルトでは、バッククォートは を破棄し、外部プログラムのstderr
のみを返します。stdout
$output = `cmd`;
プログラムの cmd をキャプチャし、stdout
破棄しstderr
ます。
キャプチャのみstderr
を行うには、シェルのファイル記述子を次のように使用できます。
$output = `cmd 2>&1 1>/dev/null`;
両方をキャプチャするにはstdout
、次のstderr
ことができます。
$output = `cmd 2>&1`;
stderr
上記を使用すると、 と区別できなくなりますstdout
。stdout
分離するには、両方を別のファイルにリダイレクトしstderr
てファイルを読み取ることができます。
`cmd 1>stdout.txt 2>stderr.txt`;
ほとんどの場合、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");
IPC::Open3またはIPC::Runを使用できます。また、perlfaq8の外部コマンドからSTDERRをキャプチャする方法もお読みください。