Perlで、Linux向けのコマンドを実行し、その実行結果を取得する方法を解説します。
はじめに・環境
本記事では、Perlを使用して、Linux向けのコマンドを実行する方法と、実行したコマンドの結果を取得する方法を説明します。
以下は、執筆時の環境です。
- OS:AlmaLinux release 8.4 (Electric Cheetah)
- Perlのバージョン:This is perl 5, version 26
system関数を使用する方法
Perlのsystem関数を使用して、コマンドを実行する方法を説明します。
単純にコマンドを実行する
以下は「pwd」コマンドを実行するサンプルです。
#!/usr/bin/perl
my $command = "pwd";
system($command);
以下はサンプルの実行結果です。
また、合わせてpwdコマンドも実行し、結果が同じことを確認しています。
[root@SYUTAKUWEB01 Perl]# perl test.pl /home/workspace/Perl [root@SYUTAKUWEB01 Perl]# pwd /home/workspace/Perl
同期しつつコマンドを実行する
system関数では、コマンドは同期実行(コマンドが終了するまで、処理をPerlに戻さない)されます。
以下は、同期実行されていることを確認するためのサンプルになります。
#!/usr/bin/perl
my $command1 = "sleep 5s";
my $command2 = "pwd";
system($command1);
system($command2);
上記のサンプルを実行すると、
実行してから、5秒後にpwdコマンドが実行されます。
[root@SYUTAKUWEB01 Perl]# perl test.pl /home/workspace/Perl
コマンドの戻り値を取得する
system関数で、コマンドの戻り値を取得する方法を説明します。
#!/usr/bin/perl
my $command = "uname -n";
my $rc = system($command);
print("戻り値:" . $rc . "\n");
上記のサンプルは、unameコマンドを実行して、その戻り値を表示しています。
[root@SYUTAKUWEB01 Perl]# perl test.pl SYUTAKUWEB01 戻り値:0
コマンドに引数を渡して実行する
system関数で、引数を渡してコマンドを実行する方法を説明します。
以下は「ls -l ./」を実行するサンプルです。
コマンドを配列形式にして、system関数に渡すことで、引数として扱うことが可能です。
#!/usr/bin/perl
my @command = ('ls', '-l', './');
system(@command);
サンプルの実行結果です。
合わせて「ls -l ./」も実行していますが、実行結果が同じなので、正しくコマンドが実行されていることが分かります。
[root@SYUTAKUWEB01 Perl]# perl test.pl 合計 20 drwxr-xr-x 2 root root 6 12月 4 12:32 sample -rw-r--r-- 1 root root 20 11月 20 09:49 test.pl [root@SYUTAKUWEB01 Perl]# ls -l ./ 合計 20 drwxr-xr-x 2 root root 6 12月 4 12:32 sample -rw-r--r-- 1 root root 20 11月 20 09:49 test.pl
エラー情報を表示する
system関数で、コマンドを実行し、エラーが発生した場合は、そのエラー情報を表示する方法を説明します。
以下は「ls -l」コマンドを実行するサンプルです。
#!/usr/bin/perl
my $command = "ls -l abc";
system($command) == 0 or die "実行エラー【$command】";
以下は、サンプルの実行結果です。
エラーが発生しない場合は、普通にコマンドの実行結果が表示されますが、
エラーが発生した場合は、コマンドの標準エラーに合わせて、Perlのどこでエラーが発生したかまで表示されるようになります。
[root@SYUTAKUWEB01 Perl]# perl test.pl ls: 'abc' にアクセスできません: そのようなファイルやディレクトリはありません 実行エラー【ls -l abc】 at test.pl line 4.
open関数を使用する方法
Perlのopen関数を使用して、コマンドを実行する方法を説明します。
コマンドの実行結果を取得して変数に格納する
コマンドを実行し、その実行結果を取得、変数に格納する方法を説明します。
#!/usr/bin/perl
my $command = "ls -l";
open(my $fh, $command . " |");
while (my $buf = <$fh>) {
print("実行結果:" . $buf);
}
close($fh);
上記のサンプルでは「ls -l」の実行結果をファイルハンドル格納変数[$fh]に格納しています。
それを1行ずつループしつつ、表示しています。
また、合わせて各行に文字列「実行結果:」を結合しながら表示しています。
[root@SYUTAKUWEB01 Perl]# perl test.pl 実行結果:合計 20 実行結果:drwxr-xr-x 2 root root 6 12月 4 12:32 sample 実行結果:-rw-r--r-- 1 root root 20 11月 20 09:49 test.pl
コマンドの実行結果を破棄する
コマンドを実行し、その結果を破棄する方法を説明します。
コマンドの後に「> /dev/null」と記述することで、実行結果を破棄することが可能です。
#!/usr/bin/perl
$status = system("ls -l > /dev/null");
print "$status\n";
上記のサンプルを実行した結果です。
実行結果は破棄し、ステータス情報を取得・表示しています。
>コマンドが成功した場合は「0」が取得されるようです。
[root@SYUTAKUWEB01 Perl]# perl test.pl 0
こちらは、存在しないディレクトリ「abc」に「ls -l」するサンプルです。
#!/usr/bin/perl
$status = system("ls -l abc > /dev/null");
print "$status\n";
上記のサンプルを実行した結果です。
実行結果は破棄されるようですが、標準エラーは取得されるようです。
>コマンドが失敗した場合は「512」が取得されるようです。
[root@SYUTAKUWEB01 Perl]# perl test.pl ls: 'abc' にアクセスできません: そのようなファイルやディレクトリはありません 512
関数を使用しない方法
Perlの関数を使用せずに、コマンドを実行する方法を説明します。
コマンドの実行結果を取得して変数に格納する①
コマンドを実行し、その実行結果を取得し、変数に格納する方法を説明します。
*こちらは、バッククォートを使用する例です。
#!/usr/bin/perl
my $command = "ls -l";
my @result = `$command`;
print(@result);
上記の実行結果です。
[root@SYUTAKUWEB01 Perl]# perl test.pl 合計 20 drwxr-xr-x 2 root root 6 12月 4 12:32 sample -rw-r--r-- 1 root root 20 11月 20 09:49 test.pl
コマンドの実行結果を取得して変数に格納する②
コマンドを実行し、その実行結果を取得し、変数に格納する方法を説明します。
*こちらは、qx/~/を使用する例です。
#!/usr/bin/perl
my $command = "ls -l";
my @result = qx/$command/;
print(@result);
上記の実行結果です。
[root@SYUTAKUWEB01 Perl]# perl test.pl 合計 20 drwxr-xr-x 2 root root 6 12月 4 12:32 sample -rw-r--r-- 1 root root 20 11月 20 09:49 test.pl
コメント