それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

シェルスクリプトで実行中の関数名を関数内部から知る(自分自身の関数名)

自分自身の関数の名前を知りたい。

関数名は、関数名を表す変数に入っている(BASHで確認)

echo ${FUNCNAME[0]}

これを使うと、自分自身の関数名を実行中に参照できる。

takuya@Desktop$ function sample() { echo ${FUNCNAME[0]} ;  }; sample
sample

便利。

なんで自分自身の関数名を知る必要があるのか。

実行後に関数を消したいから

関数を使い終わったら片付けたいときがあります。一時的な関数として、処理をブロックに分けるだけの目的で使うことがります。

function sample001() {
 # なにか処理
 
 ## 処理が終わったら自分自身消す。
 unset ${FUNCNAME[0]} ;
};

これを実行するとこのようになります。 実行後は関数が消えています。これで名前を汚さずに自分の関数をシェルスクリプトで使えます。

takuya@Desktop$ function sample001() {
>  echo ${FUNCNAME[0]} ;
>  unset ${FUNCNAME[0]} ;
> };
takuya@Desktop$ sample001
sample001
takuya@Desktop$ sample001
-bash: sample001: コマンドが見つかりません

なぜ名前を調べて消す必要があるのか。

bashrc のような dotfile で環境設定をする処理に使います。

環境設定するsample.sh をシェルスクリプトで書いた場合

function sample001() {
    ## なにか処理
    echo 環境設定をした
 };
sample001

source すると関数がENVに残ってしまう。

$ source sample.sh
$ sample001

そのために、長い処理をブロック単位に分けて書くとき無駄に関数を設定すると、unset を忘れがちになってしまう。

そこで、source するシェルの環境設定ファイルを書く場合に関数を自分自身で unset しておけば汚さずにすむ

function sample001() {
    ## なにか処理
    echo 環境設定をした
    ## 使い終わったら消す
    unset ${FUNCNAME[0]} ;
 };
sample001
$ source sample.sh
$ sample001 # not found 

このように、自分自身の関数名を知るノウハウは、シェルスクリプトで環境設定をブロック単位で管理することがしやすくなるので本当に便利りだ!!とおもった