4

10月 12

 

シェルでスクリプト実行するときの “#! path”ってなんなの?

tux

#!/usr/bin/perl
#!/usr/bin/python

などなど、Linuxサーバー上でスクリプトファイルを作成する際、文頭につけるおまじないの様な”#!” ですが、
これには”#”でコメントアウト “!”で次のプログラムで実行の意味を持っています。

つまり、スクリプトファイルの種類はperlやpython等に限定されず、対話型のプログラムであれば何にせよ
スクリプトファイルを作って実行出来るという事になります。

例えばLinuxのほとんどのサーバーに入っているcd(逆ポーランド記法計算プログラム)のスクリプトも
この形式に則れば書けるという事です。

■ 単体で実行する場合

dctestというファイルを作成して、中に以下のコードを書いてみます。

#!/usr/bin/dc
2 3 +
5 *
p

逆ポーランド記法においては 2 3 + = 2 + 3
5 * で前行の解に5を掛けています。dcはすべての式を入力し終わった後にpを入力すると演算結果を吐き出します。
つまりこの場合 (2 + 3) * 5 の結果 25 を標準出力(ディスプレイ)に出力するはずです。

実行権限を与えてやってから./dctestを実行しましょう。
ディスプレイに25が表示されているはずです。これは !/usr/bin/dc が機能した形ですね。

■ 他のバイナリの引数として与える場合

続いて以下を実行してみましょう

$cat ./dctest | dc

周知のとおりcatはファイルの中身を標準出力に吐き出すコマンドですが、cat ./dctest まで実行すると
この時点では#!/usr/bin/dcの部分まで出力されているのがわかります。
これをパイプを通してdcに渡すと、dcは#をコメントとみなし、その行を処理しません。
したがってファイルの計算部分だけを実行する事で25という正しい解を返す事ができます。
もしコメント部分を無視しない仕様であるなら、dcのプロセスを2重起動する事になりますので。

という事で”#!”の深いようなそうでないような話でした。
unix系システムの一貫性とシンプル性を少しわかっていただけたかと思います。




No comments yet, be the first.

コメントを残す