0

一部のソフトウェアのインストールを自動化する Perl スクリプトを作成しています。

私のスクリプトでは、別の bash スクリプトを実行し、その出力を取得して再度印刷します。

print `/home/me/build.sh`;

ただし、build.shスクリプトには8分かかるため、スクリプトは8分まで待機し、スクリプトは出力の印刷の開始を終了します。

bash シェルで実行されている build.sh プログラムから各行を出力するにはどうすればよいですか?

以下のコメントとして私が使用するsystem ("/home/me/build.sh");

しかし、出力はシェルに送られますが、スクリプトでログファイルへのリダイレクトを作成します。

open $fh, "> filename";
*STDOUT = $fh;
*STDERR = $fh;

次に、システム関数を使用すると、その出力はファイル名にリダイレクトされますが、そうではありません。

print system ("/home/me/build.sh");の代わりに使用する必要がありsystem ("/home/me/build.sh");ますか?

#

完全なコード:

#!/usr/bin/perl

use strict;
use warnings;

use IO::File;

my %DELIVERIES = ();
my $APP_PATH = $ENV{HOME};
my $LOG_DIR = "$APP_PATH/logs";
my ($PRG_NAME) = $0 =~ /^[\/.].*\/([a-zA-Z]*.*)/;

main(@argv);

sub main
{
        my @comps = components_name();
        my $comp;
        my $pid;

        while ( scalar @comps ) {
                $comp = pop @comps;
                if ( ! ($pid = fork) ) {
                        my $filename = lc "$LOG_DIR/$comp.log";

                        print "$comp delpoyment started, see $filename\n";

                        open (my $logFile, ">", "$filename") or (die "$PRG_NAME: $!" && exit);
                        *STDOUT = $logFile;
                        *STDERR = $logFile;

                        deploy_component ( $comp );

                        exit 0;
                }
        }
        my $res = waitpid (-1, 0);
}


sub components_name
{
        my $FILENAME="$ENV{HOME}/components";
        my @comps = ();

        my $fh = IO::File->new($FILENAME, "r");

        while (<$fh>)
        {
                push (@comps, $1) if /._(.*?)_.*/;
                chomp ($DELIVERIES{$1} = $_);
        }

        return @comps;
}

sub deploy_component
{
        my $comp_name = shift;

        print "\t[umask]: Changing umask to 007\n";
        `umask 007`;

        print "\t[Deploing]: Start the build.sh command\n\n";
        open (PIPE, "-|", "/build.sh");
        print while(<PIPE>);
}
4

2 に答える 2

6

より柔軟な方法は、 を使用することpipeです。

open PIPE, "/home/me/build.sh |";
open FILE, ">filename";
while (<PIPE>) {
    print $_;           # print to standard output
    print FILE $_;      # print to filename
}
close PIPE;
close FILE;

ところで、必要な出力ではなく、シェルスクリプトの終了ステータスであるprint system ("/home/me/build.sh");の戻り値を出力します。system()

于 2013-10-08T08:38:14.163 に答える
0

bash シェルで実行されている build.sh プログラムから各行を出力するにはどうすればよいですか?

考えられる解決策:次のことを試すことができます

システム ("sh /home/me/build.sh | ティー ファイル名");

上記のステートメントは、build.sh の出力をコンソールに表示すると同時に、tee の引数として指定されたファイル名にその出力を書き込みます。

于 2013-10-08T12:03:29.593 に答える