読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

Linux上でPerlで開発するための bash コマンド集


Perlで開発してるけどbashには詳しくない,という場合のための,bashのアンチョコ。

Perlでの開発作業を効率化することが目的。

コピペ用,bash入門用。

  1. 外部ライブラリを扱うためのコマンド
    1. インクルードパスの確認方法
    2. 特定のモジュールがインストールされているかどうかを調べる
    3. CPANのモジュールをビルドしてインストール
  2. 実行時のエラーに対処するためのコマンド
    1. Perlスクリプトの構文チェック
    2. 文字コードのチェック
    3. エラーの原因を特定する
    4. パーミッションの自動設定

これらの基本的な操作をCUIから行なえるようになれば,あとは自分で自発的に便利バッチを作って自動化する習慣が身につくはず。


(1)外部ライブラリを扱うためのコマンド

インクルードパスの確認方法

全インクルードパスを表示する。

ワンライナーで配列を改行区切りで表示すればよい。

perl -e 'print join("\n", @INC )'

perl - ワンライナーの書き方入門
http://blog.livedoor.jp/dankogai/arch...

特定のモジュールがインストールされているかどうかを調べる

「Hoge」という文字列を含む名前のモジュールがインストールされているかを検出するコマンド。

find `perl -e 'print "@INC"'` -name '*.pm' -print | grep Hoge

補足:

  • -print は,findコマンドのデフォルトのアクションなので,省略できる。
    • なお,findの -printオプションを末尾以外の場所につけると,ファイルのパターンが無視されてしまう。bashでは-printをつけない習慣にしたほうがよいかもしれない。

Perlの小技:モジュールがインストールされているかどうかを確認する方法
http://tomo.ac/goodstream/perl/tips.h...


Manpage of FIND
http://www.linux.or.jp/JM/html/GNU_fi...
評価式はオプション、判別式、及びアクションからなる。
アクションが評価式に含まれていない場合は、評価式の結果が真となったファイルに対して -print が実行される。
評価式の前の引数は検索するパスとなる。


find の -print オプションは最後につける
http://d.hatena.ne.jp/risingsun/20050218

CPANのモジュールをビルドしてインストール

開発環境がwwwに接続できない場合は,モジュールのインストール用のパッケージをCPANから落として手動でインストールする。

tar xzvf 落としてきたパッケージ.tar.gz -C 展開先ディレクトリ
cd 展開先ディレクトリ
perl Makefile.pl
make && make install

モジュールのインストールについてのメモ
http://homepage3.nifty.com/hippo2000/...

(2)実行時のエラーに対処するためのコマンド

Perlスクリプトの構文チェック

画面上でエラーを出す前に,エラーになりかねない原因を検出する。

エラーが起こってから調べる,ではなく,エラーのあるコードが動くのを未然に防ぐ。

(と言っても,perlはとても動的な言語なので,静的解析には限界があるが…)



下記をバッチにしておく。

全pmファイルとcgiファイルに対して,構文エラーのチェックを行なう。親フォルダから再帰的に検索。

#!/bin/sh


# perlアプリのあるディレクトリ
target_dir="/root/hoge_perl/"


echo "---------- Perlの構文チェック ----------"
cd ${target_dir}

for filename in $( find -type f | grep -v "\.svn" | grep "\.pm\|\.cgi" )
do 
  # 構文エラーを検出
  result=$(perl -c ${filename})
  
  # 余計な改行を省いて表示
  echo -n "${result}"
done

# perlコマンドの遅延対策
sleep 2

echo "---------- 終了 ----------"


補足:

  • grepでOR検索をする際は, grep "str1\|str2" hoge.txt のように,|に\をつけるのがポイント。
  • 文字列変数自体の末尾に改行がある場合,echoの改行付加を抑制するために echo -n とする。
  • 必要に応じてwオプションも利用する。

grepとegrepでORによるマッチングを行う際に注意すること
http://d.hatena.ne.jp/okmount/2009031...


Linux系で「echo -n」の意味を解りやすく教えて下さい。
http://detail.chiebukuro.yahoo.co.jp/...


Perlのデバッグ:文法ミスのチェック
http://perl.misty.ne.jp/20.html#b


なお,もしも単なる便利スクリプトではなく納品対象のコードであれば,単体テストを書くべきだ。

Test::Unit,Test::Classモジュールを用いたUnitTestの行い方
http://d.hatena.ne.jp/kidd-number5/20...

文字コードのチェック

UTF-8以外の文字コードで作成していないかどうかをチェックする。

大量にファイルがある場合は便利。

#!/bin/sh

# 調査対象フォルダ
target_dir="/root/hoge_perl"


echo "---------- 文字コードが UTF-8 でも ASCII でもないファイルを列挙します。 ----------"
cd ${target_dir}

# 全ディレクトリに対して
for dirname in $( find -type d | grep -v "\.svn" )
do 
  cd ${target_dir}/${dirname}
  nkf --guess * | grep "[^I8]$"
done


echo "---------- 終了 ----------"

これはPerl以外にも転用可能。

テキストファイルの文字コードを調べるには(nkf編)
http://www.atmarkit.co.jp/flinux/rens...

エラーの原因を特定する


Apacheのエラーログの末尾を閲覧する。

tail -f /usr/local/apache/logs/error_log

慣れないうちは「Premature end of script headers」を何度も見ることになるかもしれない。


もしも,tailで監視していてもエラーログがいっこうにスクロールしていかない場合,そもそもアクセスできているかどうかを疑う。

tail -f /usr/local/apache/logs/access_log

ブラウザでperl cgiにアクセスしているように見えても,実はアクセスできていないかもしれない。

そのため,perlコードの修正が画面に反映されていないように見えるのかもしれない。

(ブラウザが実は別のサーバにアクセスしているとか)

Apache ログファイル
http://httpd.apache.org/docs/2.1/ja/l...


CGIでエラーがでたら
http://www.panda-panda.com/kouza/cgi/...

パーミッションの自動設定

ファイルが増えたりロールバックされたりするたびに,手動でパーミッションを変更するのは煩雑だ。

もし忘れると, 500 Internal Server Errorが発生する。


以下を,SVN更新時のフックスクリプトにしておくとよい。

#!/bin/sh


# Perlスクリプトを実行可能に
chmod -R 755 /root/hoge_perl/*

# perlのプログラムから利用しているディレクトリがあれば,アクセス可能に
chown httpd:httpd /root/hoge_perl_dir

補足

  • chmodは再帰的に実行しているが,chownはそうしていない。なぜかというと,SVNのバージョン管理情報を格納した .svn ディレクトリまで所有者が apache に変わってしまうから。そうなると,SVN Commit時にSVNが .svn ディレクトリ内を書き換えることができず,コミットに失敗する。

補足

随時追記する。