私は誰? (スクリプト名を取得する)

シェルスクリプトで配置ディテクトリに依存しないスクリプトを書くを見ていていたのですが、awk は自分自身のスクリプト名を ARGV などから取得できません。 コマンドラインで動作するアプリケーションであっても自分自身の名前を取得できないと usage などを表示する際に不自由だと思います。

awk (gawk) で自分自身のファイル名を取得する方法はいくつかあるのですが、ここでは 2 つの方法を紹介しておきます。

1 つめは /proc から情報を得るものです。 Linux ではコマンドラインの情報が /proc/self/cmdline に格納されますので、これを読み込んで処理します。 ここでは 3 番目と決め打ちしてありますが、本格的なアプリケーションであればもう少し工夫するべきでしょう。

#! /usr/bin/gawk -f
# self.awk - show a self script

BEGIN {
    getline self < "/proc/self/cmdline";
    split(self, arr_self, "\0");
    print "My name is " arr_self[3] ".";
}

実行してみます。

$ gawk -f self.awk
My name is self.awk.

次の方法は gawk で配列 PROCINFO に PID (プロセス ID) が格納されることを利用し、ここから ps コマンドで自分自身を探すというものです。

#! /usr/bin/gawk -f
# self2.awk

BEGIN {
    self_pid = PROCINFO["pid"];
    ps_comm = "ps axl | gawk '$3 == " self_pid "'";
    ps_comm | getline self_ps_str;
    self = substr(self_ps_str, 70);
    split(self, arr_self);
    print "My name is " arr_self[3] ".";
}

実行してみます。

$ gawk -f self2.awk
My name is self2.awk.

ただし、ps コマンドのオプションの解釈は OS 依存がある場合がありますので、上記スクリプトの ps_comm の内容で不具合があるようであれば、適宜変更してみてください。