引数なしで~/.zshrc
を実行して、.
を調達したいと思います。したがって、この:
$ .
これを行う必要があります:
$ . ~/.zshrc
.
の通常の機能は変更しないでください。唯一の違いは、.
が引数なしで呼び出された場合です。
これは可能ですか?
私はいくつかの異なるアプローチを試しました。これがそれらの1つです:
dot_zshrc_or_args() {
if [[ $# == 0 ]]; then
\. ~/.zshrc
else
filename=$1
shift
\. $filename $@
fi
}
alias .=dot_zshrc_or_args
これが機能しない理由を示す例を次に示します。
$ echo 'echo $#' > count_args.sh
$ delegate() { . ./count_args.sh }
$ delegate foo bar baz
最後のコマンドは3
をエコーする必要がありますが、上記の0
のエイリアスが定義されている場合は、.
をエコーします。
基本的な問題は、.
がシェルによって特別に処理され、それによって呼び出されるスクリプトが$1
、$2
などを含むすべてのローカル変数にアクセスできるようになることです。したがって、.
を別の関数でラップしようとすると、その動作が失われます(上記の例のように)。
私が考えていた2つのアプローチは次のとおりです。
.
が別の関数から実行される場合とは対照的に、インタラクティブシェルでのみエイリアスされるようにします。何をしようとしてもうまくいきません。出来ますか? (そうでない場合、使用できる最も近い代替手段は何ですか?私の最終目標は、できれば直感的で覚えやすい方法で、シェルから~/.zshrc
をすばやく調達できるようにすることです。)
これは、accept-line
:
function _accept-line() {
if [[ $BUFFER == "." ]]; then
BUFFER="source ~/.zshrc"
fi
zle .accept-line
}
zle -N accept-line _accept-line