あまり知られていないと思うんだけど、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 を参照。