chmod +x foobar
について
何か記述したファイルを実行可能にする場合、chmod +x foobar
を実行します。
% cat hello-john
echo "Hi, there"
% ./hello-john
zsh: permission denied: ./hello-john
% chmod +x hello-john
% ./hello-john
Hi, there
autoload
について
zsh ではautoload
を使って関数を呼び出すことができます。(何かのタイミングで既に.zshrc
にautoload -U bashcompinit && bashcompinit
を記載してあったのですが、どういう意味か気になって最近調べた次第です。)
% cat ~/.zsh/functions/hello-john
echo "Hi, there"
% which hello-john
hello-john not found
% autoload -Uz $HOME/.zsh/functions/hello-john
% which hello-john
hello-john () {
# undefined
builtin autoload -XUz /Users/<username>/.zsh/functions
}
% hello-john
Hi, there
% which hello-john
hello-john () {
echo "Hi, there"
}
(autoload
の引数は絶対パスでもいいみたいです。つまり使いたい関数がFPATH
に入っていなくても直接autoload
の引数に持って来れば使えるみたいです。)
挙動の違い
-
autoload
は関数をデフォルトで遅延読み込みするそうなので、.zshrc
の読み込みが早くなり、zsh
の新しいインスタンスの立ち上がりが速くなるそうです。 - 遅延読み込みしてくれるのなら自作のスクリプトは全部
autoload
して使えばよさそうな気がしましたが、chmod +x
したファイルが別のインスタンスとして実行されるのに対し、autoload
で読み込んだ関数は現在のインスタンスで実行されるため、例えばcd
コマンドを実行するスクリプトを記述した場合、現在のディレクトリに対してそれが実行されてしまいます。現在のディレクトリを変更したくない場合はchmod +x
した実行ファイルを使うか、あるいはスクリプトに
~/.zsh/functions/foobar
current_dir=$(pwd) # 現在のディレクトリを記憶
hogehoge # メインの内容
cd $current_dir # 元のディレクトリに戻る
と記述するかというところでしょうか。
3. また、autoload
で読み込む関数ではシバングは利用できない(無視される・全てシェルスクリプトとして解釈される)ようです。例えばpython3
で記述したスクリプトは#!/usr/bin/env python3
シバングを頭に書いてchmod +x
を使うしかないようです。
引用・参考
メモ
内容に間違いがありましたらご指摘お願いします。