LoginSignup
17
17

More than 5 years have passed since last update.

unsetの-fと-v、もしくは関数と変数の名前空間について

Last updated at Posted at 2013-04-05

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(普通の人)
17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17