LoginSignup
0
0

More than 1 year has passed since last update.

chmod +x したファイル(コマンド)と autoload した関数との挙動の違い

Last updated at Posted at 2022-09-17

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を使って関数を呼び出すことができます。(何かのタイミングで既に.zshrcautoload -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の引数に持って来れば使えるみたいです。)

挙動の違い

  1. autoload は関数をデフォルトで遅延読み込みするそうなので、.zshrc の読み込みが早くなり、zshの新しいインスタンスの立ち上がりが速くなるそうです。
  2. 遅延読み込みしてくれるのなら自作のスクリプトは全部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を使うしかないようです。

引用・参考

メモ

内容に間違いがありましたらご指摘お願いします。

0
0
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
0
0