目次

Perlとシェルスクリプト

インタープリタによる実行の例(perl)

perlという言語のソースを作ります。次のプログラムを書いてHellopという名前で保存します。Helloでもいいのですが、Cで作ったものと名前がかぶるので変えています。ファイルの内容はたったの1行

print "Hello World!\n";

実行します。

$ perl Hellop
Hello World!

実行するのはperlというプログラムで、そのプログラムにHellopというファイルを読んで実行するように指示しているわけです。perlはインタープリタでHellopはプログラムということになります。

これも内容を調べてみます。

$ ls -l
-rwx------ 1 hoge hoge  6273 2009-05-06 20:00 Hello
-rw------- 1 hoge hoge    82 2009-05-06 20:00 Hello.c
-rw------- 1 hoge hoge    25 2009-05-06 20:20 Hellop

ファイルの内容を問い合わせてみます

$ file Hellop
Hellop: ASCII text

textとあるものはcatで内容を見ることができます。

$ cat Hellop
print "Hello World!\n";

hdダンプもしてみましょう

$ hd Hellop
0000000 70 72 69 6e 74 20 22 48 65 6c 6c 6f 20 57 6f 72  |print "Hello Wor|
0000010 6c 64 21 5c 6e 22 3b 0a                          |ld!\n";.|
0000020
$ 

どう見てもテキストファイルですね。

インタプリタでもファイル名だけで実行する

UNIX系のOSでは、この perl Hellop を Hellop だけで実行する仕組みがあります。ファイル名が「命令」のように見えるのでわかりやすくなります。

ファイルの先頭に次の1行を加えます。こんどはHelloperlという名前で保存しましょう。

#!/usr/bin/perl
print "Hello World!\n";

今度は実行前にもう一つしなければならないことがあります。

$ ls -l
-rwx------ 1 hoge hoge 6273 2009-05-06 20:00 Hello
-rw------- 1 hoge hoge   82 2009-05-06 20:00 Hello.c
-rw------- 1 hoge hoge   40 2009-05-06 20:24 Helloperl
-rw------- 1 hoge hoge   25 2009-05-06 20:20 Hellop

このファイルのrw-------の部分はパーミッションといって、このファイルの持ち主が読む権限(r)と書く権限(w)を持っていることを表しています。これに実行する権限(x)を加えなければ実行できません。

$ chmod u+x Helloperl 

u+xが持ち主(user)に実行権限(x)を加えるという意味です。

実行権限(x)が加えられたことを確認します。

$ ls -l
-rwx------ 1 hoge hoge 6273 2009-05-06 20:00 Hello
-rw------- 1 hoge hoge   82 2009-05-06 20:00 Hello.c
-rwx------ 1 hoge hoge   40 2009-05-06 20:24 Helloperl
-rw------- 1 hoge hoge   25 2009-05-06 20:20 Hellop

一度権限が設定されると、再設定されるまで有効になりますからこの作業は1度だけ必要です。

実行します。

$ ./Helloperl 
Hello World!

ファイルの内容を問い合わせてみます

$ file Helloperl 
Helloperl: a /usr/bin/perl script text executable

今度はperlのスクリプト(プログラム)でテキストで書かれていて、実行可能であると言っています。

後は同じです。textとあるものはcatで内容を見ることができます。

$ cat Helloperl 
#!/usr/bin/perl
print "Hello World!\n";

odダンプもしてみましょう

$ hd Helloperl 
0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 70 65 72 6c 0a  |#!/usr/bin/perl.|
0000010 70 72 69 6e 74 20 22 48 65 6c 6c 6f 20 57 6f 72  |print "Hello Wor|
0000020 6c 64 21 5c 6e 22 3b 0a                          |ld!\n";.|

インタープリタによる実行の例2(シェルスクリプト)

端末の中で私たちのコマンドラインからの命令を解釈して実行しているプログラムをシェル(shell)と言います。シェルにはコマンドをあらかじめファイルに書いておいてまとめて実行するという仕組みがあります。これをシェルスクリプトといいます。

これもインタープリタ型の言語といえます

ソースを作ります。次のプログラムを書いてHellosという名前で保存します。もちろんこれもHelloでもいいのですが、Cで作ったものと名前がかぶるので変えています。ファイルの内容はたったの1行

echo "Hello World!\n"

そして実行権は、

$ sh Hellos
Hello World!\n

または、

$ . Hellos
Hello World!\n

ファイル名だけで実行する

実行権があればファイル名だけで実行できます。

$ chmod u+x Hellos
$ ./Hellos
Hello World!\n

perlでは1行目に何というインタプリタで実行するかを指定しましたが、これを書かなければいつも使っているシェルで実行されます。もし書きたければ、

#!/bin/sh
echo "Hello World!\n"

とします。

実は先頭の#!でインタープリタを指定する仕組みが作られたのは、シェルにいくつかの種類があって、若干書き方が異なったからです。シーエルはユーザーの好みで切り替えられるのですが、だれが実行しても同じシェルで実行するようにしなければならなかったのでした。ついでに、perl, python, rubyなど将来作成される物も含めていろいろなインタープリタを指定してプログラムをコマンドのように実行できるようにしました。これはすごくステキな仕組みです。

ちなみにLinuxの多くがbashというシェルを標準としています。他に、csh や tch などがありますが、標準のシェルは sh という別名を付けるのが普通です。