Perlゼミ

  1. Perl
  2. 演算子
  3. here

バッククォート演算子 - 別プロセスを実行し標準出力を取得

バッククォート演算子を使うと、別のプロセスを実行し、プロセスが生成した標準出力を取得することができます。

# バッククォート演算子
my $output = `$cmd`;

system関数とかなりよく似ていますね。system関数が戻り値として、終了ステータスを返すのに対して、バッククォート演算子は、プロセスの標準出力を返します。

lsコマンドを実行する

バッククォート演算子のひとつの例としてカレントディレクトリの内容を表示するLinuxのlsコマンドを実行してみます。

my $output = `ls`;

$outputには、カレントディレクトリの一覧が表示されます。

a.pl              gperl                             module-starter.txt                not_important_project  ringowiki  static-perl.tar
batch             Image-PNG-Simple                  mojo                              Object-Simple          role       taskdeal
crontab.txt       imager-japanese-translation.wiki  mojo-examples

呼び出したプロセスの戻り値をチェックするには

バッククォート演算子で呼び出すプロセスが失敗したりエラーステータスを返したりした場合は、どのようにチェックするのでしょうか。

特殊変数「$?」を使用します。

この値が0以外だった場合は、何らかのエラーが発生しています。

# エラーチェック
if ($?) {
  die "Command error";
}

さらに詳しくエラーの状態を知ることもできます。

$?は16bitの値で、上位8bitに、子プロセスの終了ステータスが格納されます。右8bitシフトをすれば、終了ステータスが取り出せます。

my $output = `ls`;

# 子プロセスの終了ステータスをチェック
my $status = $? >> 8;
if ($status != 0) {
  # エラー処理
}

バッククォート演算子のセキュリティ

バッククォート演算子は、セキュリティの問題が起こりやすい演算子です。たとえば、もしWebからの入力データが「rm」で、それをバッククォート演算子にチェックせずに渡したとしたらと考えてください。

バッククォート演算子によって、意図しないコマンドを実行されてしまいます。

ユーザーからの入力をプログラムで受け取っている場合は、バッククォート演算子に渡す文字列については、必ず入力が安全なものであることを確認してください。

バッククォート演算子のサンプル

バッククォート演算子のサンプルです。

use strict;
use warnings;

my $output = `ls -l`;

if ($?) {
  die "Command error";
}

print "$output\n";
Perlの書籍
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
    この私、Perlゼミの作者が執筆しています。
    ご購入、口コミ歓迎。
  • Perlの書籍 »
自己紹介
木本裕紀

「今日も元気だ、Perlで元気。
ゆとりあるITエンジニアライフのために
Perl情報を前向きに発信中!」

Twitter
フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎

kimoto.yuki@gmail.com
応援メッセージ、質問、間違い報告歓迎

木本システム株式会社
ご紹介キャンペーン実施中です。契約金額の10%をご紹介料としてお支払い。

(例)30万円のシステム開発委託契約が、1年続いたら、36万円がもらえる!!!