【Perl】Linuxコマンドの実行と実行結果の取得方法


この記事はプロモーションを含みます。

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

コメント

タイトルとURLをコピーしました