Help us understand the problem. What is going on with this article?

zsh で無名関数を作る

More than 5 years have passed since last update.

あまり知られていないと思うんだけど、zsh には無名関数を作ってすぐに実行する機能がある。JavaScript で言うところの (function() { /* ... */ }()); と同じやつ。これを使うと一時的な変数を作ってグローバルな領域を汚さないように出来るので紹介する。

書き方

書き方は簡単で、普通の関数定義の関数名の部分を省略すればOK。zsh の関数定義はいくつか書き方があるので、無名関数の書き方もその分だけある。

具体的には以下の通り。

() {
  # 何か処理
  # local var1 とか
}

または

function {
  # ...
}

または

function() {
  # ...
}

これで「無名関数を定義してすぐに実行する」という動作になる。

無名関数の中で local を付けるとその関数内だけで有効な変数になるので、一時的な変数を使いたい時に便利。グローバルな変数名とかぶったとしてもローカルな変数が優先されるので大丈夫。

variable="outside"
() {
  local variable="inside"
  echo "var = $variable"
}
echo "var = $variable"

# => var = inside
# => var = outside

使い方の例

例えば zshrc でディレクトリの存在チェックをするときとかに利用できる。

# ~/path/to/dir ディレクトリが存在しないときは作成する
() {
  local dir_path=~/path/to/dir
  if [[ ! -d "$dir_path" ]]; then
    mkdir -p $dir_path
  fi
}

パスを何回も直書きしなくてすむし、その後変な変数が残ったりしないので便利。

引数を渡す

括弧の後ろに書いて引数を渡すこともできる。こんな感じ。

() {
  echo $1 $2
} Hellow World

# => Hellow World

詳しくは man zshmisc(1) の ANONYMOUS FUNCTIONS を参照。

mollifier
zsh, vim, vimperator, JavaScript, iOS, .NET に興味があるプログラマ
http://mollifier.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away