0

Perlスクリプトを使用して、特定の方法で構成されたサブシェルが必要なコンパイル済みプログラムを構成および生成します。$returncode = system("ulimit -s unlimited; sg ourgroup 'MyExecutable.exe'");

そこからSTDOUTをキャプチャして解析したいのですが、ジョブの実行中に出力を確認できるように、分岐する必要があります。この質問は近いです: Perl 出力を STDOUT と変数の両方に送信するにはどうすればよいですか? 最高評価の回答はbacktick()、子プロセスを作成し、 をキャプチャしSTDOUT、その中で を使用してコマンドを実行するという関数について説明していexec()ます。

しかし、私が持っている呼び出しでは、シェルを構成するために複数の行が必要です。1 つの解決策は、使い捨てのシェル スクリプトを作成することです。

#disposable.sh
    #!/ビン/sh
    ulimit -s 無制限
    sg ourgroup 'MyExecutable.exe'

backtick(disposable.sh)その後、またはのいずれかで必要なものを取得できましたopen(PROCESS,'disposable.sh|')

しかし、私はこのためにスクラッチ ファイルを作成したくありません。system()複数行のコマンド文字列を喜んで受け入れます。どうすれば同じことを取得exec()または実行できopen()ますか?

4

3 に答える 3

1

シェルの機能 (ループ、変数だけでなく、複数のコマンドの実行も含む) を使用する場合は、シェルを呼び出す必要があります (open(..., 'xxx|')それは行いません)。

シェルのオプションを使用して、シェルスクリプトをシェルに渡すことができます-c(別の可能性は、コマンドをシェルにパイプすることですが、それはより困難です)。つまりbacktick、次のように他の回答から関数を呼び出すことを意味します。

backtick("sh", "-c", "ulimit -s unlimited; sg ourgroup 'MyExecutable.exe'");
于 2013-04-10T19:07:27.530 に答える
0

バックティックを使用したシステムteeはこれを行いますよね?

my $output = `(ulimit -s unlimited; sg ourgroup 'MyExecutable.exe') | tee /dev/tty`;

またはAlnitakのものを変更backticksします(サブシェルを使用します)?

my $cmd = "ulimit -s unlimiited ; sg ourgroup 'MyExecutable.exe'";
my $pid = open(CMD, "($cmd) |");
my $output;
while (<CMD>) {
   print STDOUT $_;
   $output .= $_;
}
close CMD;
于 2013-04-11T05:17:34.703 に答える