Bashスクリプトで変数を削除するときにunset
を使いますが、これは関数定義の削除にも使えます。-f
と-v
オプションは関数と変数のどっちを削除したいかを明確にするオプションです。
Bashにおける関数と変数の名前空間
は、分かれています。なので以下のように同名の関数と変数を作っても区別して使えます。
f() { echo func; }
f=valiable
f # func が表示される
echo $f # valiable が表示される
unsetで削除されるのは?
unset
は変数も関数も削除できます。では同名の関数と変数があった場合はどうなるんでしょう?
f() { echo func; }
f=valiable
unset f # オプション無しでunset
f # func が表示される …関数は残ってる
echo $f # (空) …変数だけ削除された!
unset f # もう1回unsetしてみる
f # -bash: f: command not found …関数も削除された!
echo $f # (空)
というわけで同名の関数と変数がある場合は変数だけが削除されて、同名の変数が無ければ関数が削除されます。
関数または変数を狙って消すには?
そこで登場するのが-f
と-v
です。-f
は関数のみを消すオプションで、-v
は変数のみを消すオプションです。
f() { echo func; }
f=valiable
unset -f f # 関数を消す!
f # -bash: f: command not found …関数が消えた!
echo $f # valiableが表示される …変数は残ってる!
f() { echo func; }
f=valiable
unset -v f # 変数を消す!
f # funcが表示される …関数は残ってる
echo $f # (空) …変数が消えた
f() { echo func; }
f=valiable
unset -fv f
# -bash: unset: cannot simultaneously unset a function and a variable
# 一緒に消すことは出来ないみたいです
usnet -f f; unset -v f # 改めて両方消します
# この状態で更にunsetしても特にエラーは出ません
unset -f f; echo $? # 0
unset -v f; echo $? # 0
unset f ; echo $? # 0
まとめ
- bashにおける関数と変数の名前空間は別である
- オプション無しで
unset
するとその時の状態により関数が消えたり変数が消えたりする - 自分が何を消したいのかをハッキリさせるには
unset
に-f
や-v
を付けるべし(潔癖症) - そもそも関数と変数に同じ名前を使わない方が良いw(普通の人)