私の.profile
(.zshrc
からsh
エミュレーションモードで供給)には、次のスニペットがあります。
if [ -f /usr/bin/pacmatic ]; then
alias pacman=pacmatic
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
ただし、2番目のエイリアスは常に最初のエイリアスをオーバーライドします。
% type pacman
pacman is an alias for pacman --color auto
2番目のエイリアス割り当てが最初の割り当てを「継承」して/usr/bin/pacmatic
が存在する場合、エイリアスがpacmatic --color auto
になるようにするにはどうすればよいですか?
私はエイリアスの代わりに関数を使用することを嫌いではありませんが、pacman
が呼び出されるたびにロジックが実行されない場合はそれを好みます(シェルでpacmatic
を一度チェックしたい起動時。pacman
が実行されるたびではありません)。 sh
-ポータブルスクリプトもお勧めしますが、これが不可能な場合は、完全なzsh
構文を使用できます。
(はい、これは--color auto
をpacmatic
エイリアスに追加することで簡単に解決できることを認識しています。しかし、RightWay™で実行したいと思います。)
グーグルしてマンページを調べてみましたが、役に立ちませんでした。
シェルalias
は#define
とほぼ同じように動作します。つまり、シェルエイリアスを再定義すると、前のエイリアスが上書きされます。
正しい方法がわからないTMただし、1つのアプローチは、パラメーターを受け入れるShell関数を使用し、それを使用してエイリアスを作成することです。コードスニペットは次のように書き直すことができます。
if [ -f /usr/bin/pacmatic ]; then
pacman() { pacmatic "$@"; }
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
さらに、異なるエイリアスを使用していて、一方を使用して他方を定義しようとしても、エイリアスはデフォルトで非対話型モードで展開されないため、機能しません。 expand_aliases
を設定して有効にする必要があります。
shopt -s expand_aliases
マニュアルからの引用:
Aliases are not expanded when the Shell is not interactive, unless the
expand_aliases Shell option is set using shopt (see the description of
shopt under Shell BUILTIN COMMANDS below).
エイリアス置換は、インタラクティブソースから行を読み取る場合にのみ実行されます。したがって、2番目のエイリアスは最初のエイリアスの影響を受けないため、文字通りの置換になります。
おそらく似たようなもの:
PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
PACMAN=pacmatic
fi
# Colorized Pacman output
alias pacman="${PACMAN} --color auto"
これにより、「pacman」が適切な値に設定され、PACMAN env変数がエクスポートされないため、スクリプトが終了すると削除されます。「二重引用符」を使用すると、エイリアスの宣言時に変数置換が確実に行われます。呼び出しごとではありません。
私は同様の方法を使用します:
PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"
基本的に、env var PACMANを設定し、パスでpacmaticをテストし、見つかった場合はPACMANを設定してから、エイリアスを定義します。
うーん、もう少し最適化できます...
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"
ターダー! PACMANが設定されていないかnullの場合は、「pacman」に設定します。それ以外の場合は、PACMANの値に設定し、「which」行でpacmaticに設定します。
Zshでは、 aliases
連想配列を使用してエイリアスに簡単に追加できます。
alias pacman="${aliases[pacman]-pacman} --color auto"
他のシェルでは、alias
コマンドの出力を使用して、既存のエイリアスを確認する必要があります。
current_pacman_alias=$(alias pacman 2>/dev/null)
alias pacman="${current_pacman_alias:-pacman} --color auto"
私はこれを可能性として提供していますが、他の回答ですでに提案されているように変数を使用することにします。より明確であり、pacmatic
またはpacman
のどちらが使用されているかに基づいていくつかの設定を変更する場合は、変数の値を区別できます。
pacman==pacmatic 2>/dev/null || pacman=pacman
alias pacman='$pacman --color auto'
2番目のエイリアスの短いバージョンは次のようになります。
alias pacman=$PACMAN' --color auto'
pacman() ( def_args="--color auto" bin=
[ -x ${bin:=/usr/bin/pacmatic} ] || bin=
[ -x ${bin:=/usr/bin/pacman} ] || bin=
${bin:?WHERE THE HELL IS PACMAN????} \
$def_args "$@"
)
エイリアスは鳥用です。