パラメータなしで実行して~/.zshrc
リソースを取得したいです.
。だからこれ:
$ .
以下を行う必要があります。
$ . ~/.zshrc
通常の機能は変わらないことを願っています.
。唯一の違いは、.
パラメータなしで呼び出すときです。
可能ですか?
私はいくつかの異なるアプローチを試しました。これはその一つです:
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
最後のコマンドはechoでなければなりません3
が、上記のエイリアスが定義されている場合は0
エコーされます。.
.
基本的な問題は、シェルがそれを特別に処理して呼び出すスクリプトが、などを含むすべてのローカル変数にアクセスできるようにすることです$1
。$2
したがって、他の関数をラップしようとすると、その動作は.
失われます(上記の例のように)。
心に浮かぶ2つのアプローチは次のとおりです。
- 関数の代わりにエイリアスを使用してください
.
他の関数で実行するときは使用せず、対話型シェルでのみエイリアスを使用するようにします。
しかし、いくら努力しても正常に動作できません。可能ですか? (そうでなければ私が使用できる最も近い選択肢は何ですか?私の究極の目標は、シェルからリソースをすばやく、できるだけ直感的で~/.zshrc
覚えやすい方法でインポートできることです。)
答え1
これはひどいことをすることによって行うことができますaccept-line
:
function _accept-line() {
if [[ $BUFFER == "." ]]; then
BUFFER="source ~/.zshrc"
fi
zle .accept-line
}
zle -N accept-line _accept-line
答え2
必要に応じて組み込み関数を呼び出すには、function
forを作成します。また、シェル数の比較には正しくありません(奇妙でorが必要です)。.
.
==
test
-eq
-ne
function . {
if [[ $# -eq 0 ]]; then
builtin . ~/.zshrc
else
builtin . "$@"
fi
}