シェルスクリプトはどうやって自分自身のファイル名を拾うか

2015年5月25日月曜日

calc linux unix シェルスクリプト

前回はシェルスクリプトから数値計算するのにbcを使ったけど、 数値計算用のスクリプト言語としてcalcというのがある。
プログラミング言語として面白い特徴がいくつかあったので書いてみる。

オプションとして-fフラグというフラグがある。
このフラグは #!/usr/bin/calc のようにシェバンでcalcを実行する場合に指定し、しかもオプションの中でも最後に指定しろ、となっている。

なぜこんなことになっているかというとシェバンが書かれているファイルのファイル名がほしいから。

通常、unixのシェルからコマンドを呼び出すとシステムがexecシステムコール呼び出し時に引数リストの先頭に呼び出されたコマンドのパスを付加する。

試しにCで以下のようなプログラムを書いて、実行ファイル名をshbangとしてみると

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("%d\n", argc);
    printf("%s\n", argv[argc - 1]);

    return 0;
}

$ ./shbang
1
./shbang

しかし、以下のようにシェルスクリプトのシェバンを通じて呼び出されると

$ cat shbang.sh
#!/path/to/shbang
$ ./shbang.sh
2
./shbang.sh

つまりこれは結果としてシェルから以下のコマンドを実行したのと等しい。

$ /path/to/shbang ./shbang.sh

通常、perlやrubyのようなスクリプトを実行するときはコマンドライン引数の最後で実行するファイル名を指定するけど、シェバンを使って起動されたときは起動された自分自身のファイル名が自動的に付加されているので、ファイル名を指定したのと同じ効果があるわけだ。

あ、この話って別にcalcの話じゃないですね。