LoginSignup
64
56

More than 5 years have passed since last update.

zsh で無名関数を作る

Posted at

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

64
56
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
64
56