0

簡単な操作を行うには、スクリプトが必要です。

  1. unix スクリプト コマンドを使用して、画面上のアクティビティをファイルに記録します。
  2. シェル スクリプトを実行します (このスクリプトによって STDOUT に複数の行が出力されます)。
  3. スクリプト コマンドを停止する
  4. スクリプト コマンドの出力を分析する

システム コマンドを使用してこの作業を行う予定ですが、シェル スクリプトを fork して完了を待つ必要があるかどうかはわかりません。シェルスクリプトの出力は複数なので、キャプチャが機能するかどうかはわかりません。最良の選択肢を教えてください

4

2 に答える 2

0

なぜあなたscriptはまったく使う必要があるのですか?シェルスクリプトはインタラクティブですか? 有効な TTY が必要ですか? 有効な TTY を必要としない非対話型のバッチ ジョブである場合は、それをパイプとして開き、ファイル ハンドルを介して出力を処理することをお勧めします。

例えば:

open my $cmd_handle, "-|", $command, @args 
    or die "Could not run $command @args: $!";

foreach my $line ( <$cmd_handle> )
{
    # ... process the command output here ...
}

close $cmd_handle;

これには、Perl スクリプトがコマンドの出力を発生時に処理するという利点があります。本当に最後まで処理を延期する必要がある場合は、すべての出力を配列に丸呑みしてから、後で処理することができます。

open my $cmd_handle, "-|", $command, @args 
    or die "Could not run $command @args:  $!";

my @cmd_output = ( <$cmd_handle> );
close $cmd_handle;

foreach my $line ( @cmd_output )
{
    # ... process the command output here ...
}

script上記の制限 (非対話型であり、有効な TTY を必要としない) を満たしている場合は、コマンドを実行するよりも優れているはずです。ほとんどのバッチ スクリプトは、これらの制限を満たしています。

于 2013-06-09T17:40:59.393 に答える
0

これは、私が最近遭遇した最も興味深い質問の 1 つです。

シェル スクリプト myscript.sh があるとします。スクリプトを実行して出力を取得するには、少なくとも私の SUSE Linux では、script(1) のマニュアル ページを確認してください。

    script -c /path/to/myscript.sh myscript.log

したがって、Perl は漠然と次のようになります。

# first, a bunch of code to initialize the program

# then run the shell script.
my $rv = system("script -c /path/to/myscript.sh myscript.log");

# then a bunch of code to process myscript.log

しかし、私はあなたができないのは不思議です:

 system("/path/to/myscript.sh > myscript.log");

script(1) を使用する代わりに?

于 2013-05-30T16:27:20.003 に答える