既存のエイリアスからエイリアスを作成する

既存のエイリアスからエイリアスを作成する

2つの別々のファイルがあり、どちらもmyで始まり、.zshrcそのうちの1つ(最初のファイル)がこのエイリアスを定義します。

alias wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"'

問題は、この次のものもwgetエイリアスを定義することです。

alias wget='wget -c'

どういうわけか、2番目のエイリアスが以前のエイリアスを使用して独自に定義されるようにする必要があります。私は似たようなものを使用しようと思っていましたが、$(wget)それは単に再帰ループに陥りました。新しいエイリアスを定義するときに、同じ名前の既存のエイリアスを参照するための良い方法はありますか?

何らかの方法で最初のエイリアスの内容を取得し、新しいフラグに関連付けてコマンドの前にエイリアスがまだない場合は、以前のエイリアスに基づいて構築することを考えることもできます。

注:別名の1つの名前を変更し、次の別名で参照できることを知っていますが、それは私が望むものではありません。また、単に手動で1つのエイリアスとして定義したくありません。新しいエイリアスを定義するときは、古いエイリアス定義を自動的に使用して互いにリンクする方法が必要です。

このようなことをどのように実装できるのかご存知ですか?それとも、このようなことをするより良い方法がありますか?

答え1

あなたはそれを使用することができますaliasesハッシュテーブルそのために:

% zmodload -F zsh/parameter p:aliases
% alias wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"'
% alias wget="$aliases[wget] -c"
% alias
wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts" -c'

以前にコマンドにエイリアスが指定されていない場合は、実際のコマンドに戻るためにいくつかの処理を実行する必要があります。

これはを使用して達成できます${aliases[wget]:-wget}。次に空の場合、$aliases[wget]リテラル値が使用されます。wget

答え2

これはalias、出力を見苦しく解析することによって行うことができます。

$ alias foo='foo --first'
$ alias foo=$(alias foo | cut --delimiter== --fields=2 | head --bytes=-2 | tail --bytes=+2)' --second'
$ alias foo
alias foo='foo --first --second'

もちろん、alias別名を別の形式(複数行または別の引用符)で印刷すると、すべてのベットがキャンセルされます。また、エイリアスがまだ設定されていない場合も処理しません。

$ unalias foo
$ alias foo=$(alias foo | cut --delimiter== --fields=2 | head --bytes=-2 | tail --bytes=+2)' --second'
bash: alias: foo: not found
$ alias foo
alias foo=' --second'

関連情報