Posted at

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 を参照。