zsh: "source" コマンドは機能を再ロードしません。

zsh: "source" コマンドは機能を再ロードしません。

(これはzsh 5.7.1がインストールされているMacOSにあります)

zshからカスタム関数をロードする方法は次のとおりです。

# Custom functions
fpath=($HOME/.zfunc $fpath)
autoload -Uz mackupbackup
autoload -Uz tac
autoload -Uz airplane
autoload -Uz wakeMyDesktop

各関数は~/.zfuncディレクトリ内の独自のファイルです。その後、このディレクトリは他のディレクトリにシンボリックリンクされていますmackup

現在、コミットハッシュをクリップボードにコピーする新しい関数を作成しました。 $ fpathというファイルを作成しghash、関数を作成し、autoloadmyに新しい行を追加して.zshrc実行しましたsource ~/.zshrc

これは機能です

# copy the commit hash of the given git reference, or HEAD if none is given
ref=$1

if [[ $ref ]]; then
  git rev-parse $1 | pbcopy
else
  git rev-parse HEAD | pbcopy
fi

購入後に.zshrc機能が利用可能になって動作しますが、動作確認を印刷するために次の行を追加したいと思います。

echo "Copied $(pbpaste) to clipboard"

だから、その行を追加し、ファイルを保存して.zshrc再インポートしました。

関数を再実行しましたが、動作は変わりませんでした!

私が何か間違っているようで、機能を変え続けてソーシングを変更しましたが、.zshrc役に立ちませんでした。全体的に.zshrcリソースを22回再インポートしましたが、その時点で作業を完了するのに37秒かかりました。

その後、関数を再ロードするのではない可能性があることに気づき、zshstart新しいインスタンスを実行し(約1秒かかり)、関数が期待どおりに機能し始めました!

source新しい機能を選択したが機能が変更された後に更新されなかった理由を知っている人はいますか?

source ~/.zshrcボーナスの質問:実行するたびに時間がかかるのはなぜですか?

答え1

実際、人々が冪等になるようにファイルを作成することはほとんどないので、rcファイルをインポートすることはほとんどありません。一般的な例は、毎回同じディレクトリをパスの前に追加するユーザーの場合ですfpath。これは、もちろん、そのルートを検索するのに時間が長くかかることを意味します。そして間違いなく、ここがこの種のことをすることができる唯一の場所ではありません。

また、自動ロードを正しく理解していません。ドキュメントに示すように、本文を持たない関数は自動的にロードされます。その機能が初めて実行されたとき。明らかに、関数がすでにロードされており、関数本体がある場合は再ロードされません。

関数を再度呼び出す前に、その関数を呼び出す必要がありますunfunctionautoload

.zshrcZシェルソースの例freload()引数の後に、名前付きのすべての関数に対してこれを実行する関数が含まれています。typeset -U path cdpath fpath manpathはい。

答え2

autoloadaはzshでname最初の参照時に自動的にロードされるとマークされていますが、名前がすでに定義されている場合は名前が定義された後にすでに参照されるため、同じ名前の既存の関数はオーバーライドされません。必要なものを得るには、.zshrc関数を再ソーシングする前に定義を解放する必要があります。または、より簡単にするには、自動ロード用のラッパー関数を作成して、指定された関数名が定義されていることを確認し、その場合はタグに自動的にロードされます。定義を解除する前にもう一度確認してください。

試すたびに購入が遅くなる理由には.zshrc答えられません.zshrc

関連情報