Perlのエラーメッセージのコーナー。
Perlのエラーメッセージが表示される最小のプログラムを書いて、どういうときにどう怒られるかを研究する。
今回のお題は
%s command not found
である。

US Navy 060508-N-9380A-032 - Commander, U.S. Central Command (CENTCOM) Gen. John Abizaid, and Commander, U.S. Navy 5th Fleet, Vice Adm. Patrick Walsh, right, visit Commander, Combined Task Force One Five Zero (CTF-150),
これは、

(主語S):%s command
(修飾子M):not found

というエラーメッセージにありがちなbe動詞なしの受動態で、

(主語S):%s コマンドは
(修飾子M):見つからなかった

だから
%sコマンドは見つからなかった
という訳になる。

これは、絶対にエラーメッセージの字面だけ見ていても分からない。
ユーザーフレンドリーで知られるPerlのメッセージにはあるまじきことである。
というのは、Perlエンジンが出力しているメッセージではないからである。

前回この連載で動かしたプログラムをちょっといじって実行してみる。
#! /bin/sh
#
# attrTest.pl -- 属性のテスト(2)MODIFY_CODE_ATTRIBUTES関数を書いてみた

use 5.010;
use strict;
use warnings;
use utf8;

sub MODIFY_CODE_ATTRIBUTES {
my ($pkg, $ref, @attr) = @_;
say "MODIFY_CODE_ATTRIBUTES ran!!!";
say " pkg:", $pkg;
say " ref:", $ref;
say " attr:", @attr;
return;
}

&test_sub("Yeah!");

sub test_sub : Sonna_Zokusei_nai {
my $str = shift;
say "test_sub: str:", $str;
}
実行してみる。
[perl]$ [perl]$ attrTest.pl
/Users/query1000/perl/attrTest.pl: line 5: use: command not found
/Users/query1000/perl/attrTest.pl: line 6: use: command not found
/Users/query1000/perl/attrTest.pl: line 7: use: command not found
/Users/query1000/perl/attrTest.pl: line 8: use: command not found
/Users/query1000/perl/attrTest.pl: line 10: sub: command not found
/Users/query1000/perl/attrTest.pl: line 11: syntax error near unexpected token `$pkg,'
/Users/query1000/perl/attrTest.pl: line 11: ` my ($pkg, $ref, @attr) = @_;'
[perl]$
見事に目的のエラーメッセージが表示された。

ではなぜ怒られているのだろうか。
簡単にいうと、Perlのスクリプトを/bin/sh(いまぼくが使っているMacの環境では、bash)に渡しているから起こる現象だ。

1行目の
#! /bin/sh
が問題だ。

これは、PerlではなくUNIX系のOS(Linux、BSD、Mac OS Xを含む。なおMac OS Xというのは旧称であって、いまは単にOS Xと正式には言うそうだが、流行らない)の機能で、shebang行という。

#!で始まる行である。
#というのはPerlのスクリプトであっても、シェルスクリプトでも同じで、そこから行末までコメントであるという意味になる。
よってこの行は、スクリプトとしては無視される。

ただし、#のあとに!を書くと、この行はshebang行になって、シェルで読み込むと特殊な動作をする。
その後に書いてあるプログラムを起動し、そのプログラムにこれ以降のスクリプトを渡すのである。

「#! /bin/sh」という行で始まるファイルはシェルスクリプトとして/bin/shで解釈実行され、「#! /usr/bin/perl」という行で始まるファイルはPerlスクリプトとして/usr/bin/perlで解釈実行される。
システム標準の/usr/bin/perlの他に、/usr/local/bin/perlに実験的なPerlを入れている場合、この行で切り替えることもできる。

このため、UNIXのスクリプトファイルは拡張子がいらない。

Windowsの場合は、拡張子を見て実行するプログラムを決める。
ActivePerlなどのWindowsで多く使われる環境では「.pl」という拡張子がPerlエンジンperl.exeに関連付けられる。
ぼくはWindowsにおもねってPerlのスクリプトには「.pl」という拡張子を付けているが、UNIXで使う場合ほんらいこれは不要で、shebang行を見て実行するプログラムを決める。

よって、上のプログラムの場合は、shebang行を元通り
#! /usr/local/bin/perl
などと、実行したいPerlエンジンのフルパス名を書くか、コマンドラインから実行するときに
[perl]$ [perl]$ perl attrTest.pl
などと、perlコマンドの引数としてスクリプトファイルを実行すれば良い。

このエラーメッセージシリーズは、ラクダ本ことProgramming Perlの巻末に載っている診断メッセージ集を見て端から研究しているが、ここに、Perlエンジンとは無関係なUNIX由来のエラーメッセージが堂々と載っているのが面白い。
たしかに、初学者はこのメッセージを見て、何かPerlで間違っているか、と思うであろう。
このへんにもLarry Wallさんおよび、Perlコミュニティの親切さが出ている気がする。

以下余談。
このshebangという行のカタカナ表記が難しい。Webの辞書を引くと

Shebang | Define Shebang at Dictionary.com

シュバング、と言っているような気がする。

この最初のsheはschwa(シュワ)というやつで、

Listen-IT: 文章編2:大事なシュワ

曖昧な発音をする。

ところが、世のUNIX関係の日本語入門書は、ほとんどすべてシェバング、と、思いっきり書かれているのである。

これは困ったことだ。
ぼくはなんとなく英語に引きずられてシュバング、と言っているが、これは少数派である。

と、思ってきたが、いまなんとなくGoogleで引いてみると、シェバング1240件に対して2300行だ。
あんまり差がないなー。

(追記 2014-07-16)

とか言ってたけど、いまどきは「シバン」とカタカナ表記、および、発音するのが多数派のようだ。
Google検索すると18900件もヒットするし、思いっきり日本語版Wikipediaにも「シバン」と書いている。

<a href="http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_(Unix)" target="_blank">シバン (Unix) - Wikipedia</a>

ううん、でも発音が出る英語辞典では「シュバング」と聞こえるんだなあ。
シバンなあ。