2012/06/27

shebang

スクリプトの先頭行に書かれている #!/bin/sh の事を shebang (シェバング) と呼ぶ。
古くはプログラムが実行された際にローダがファイルの先頭 2 バイトを参照して ファイルの形式を調査した事に由来しているらしく、 例えば FreeBSD や Linux の最近の実行可能ファイルであれば 7f45(16) になっている (その後 4c46(16) と続いているので、 ファイルをダンプすると ELF と読める)。
ファイル先頭のこの値の事を magic number とも呼び、 初期の file (1) コマンドはこの magic number を読み取って ファイルの種類を報告していた (今の file (1) も基本は magic number を利用している)。

shebang は通常はスクリプトを実行するインタプリタのパスを記述するのだが、 実は実行可能なプログラムであればインタプリタ以外も記述できるので、 あるプログラムの設定ファイルの先頭にプログラム名自身を書いておくと その設定でプログラムが実行できて実は便利である。

例えば sshd/usr/local/etc/sshd/mysshd.conf を設定ファイルとして起動したい場合、通常はこの様に起動する。

# /usr/sbin/sshd -f /usr/local/etc/sshd/mysshd.conf
    
ところが設定ファイル /usr/local/etc/sshd/mysshd.conf の 先頭の shebang に #!/usr/sbin/sshd -f を追加して /usr/local/etc/sshd/mysshd.conf に実行権限を与えると、 設定ファイルを実行する事で sshd が起動できるので便利だ。
# cat /usr/local/etc/sshd/mysshd.conf
Port        20022
Protocol    2
    :
# ex -s !$ <<- EOF
ex -s /usr/local/etc/sshd/mysshd.conf <<- EOF
>  0i
>  #!/usr/sbin/sshd -f
>  .
>  w!
>  EOF
# head !$
head /usr/local/etc/sshd/mysshd.conf
#!/usr/sbin/sshd -f
Port        20022
Protocol    2
    :
# chmod 755 !$
chmod 755 /usr/local/etc/sshd/mysshd.conf
# !$
/usr/local/etc/sshd/mysshd.conf
# netstat -anf inet | egrep '^Active|^Proto|\.20022'
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  *.20022                *.*                    LISTEN
    
実行例で利用している "!$" は GNU bash (1) の コマンドライン履歴機能で直前に実行したコマンドの最後の引数に展開される。
GNU bash (1) には他にも 色々な履歴の参照機能 があるので、 覚えておくとコマンドの入力が格段に便利になる。


Copyright © Mitzyuki IMAIZUMI 2008,2009. All rights reserved.