シェルエイリアスを「スタック」する方法は?

シェルエイリアスを「スタック」する方法は?

私のシミュレーションモード.profileには、次のコードスニペットがあります。sh.zshrc

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

/usr/bin/pacmatic2番目のエイリアス割り当てが最初の割り当てを「継承」して存在する場合にエイリアスを作成するにはどうすればよいですかpacmatic --color auto

私はエイリアスの代わりに関数を使用することに反対しませんが、呼び出されるたびにロジックが実行されないことをお勧めします(シェルが実行されるたびにチェックするのではなく、シェルが起動したときに一度確認したいpacman)。また、移植可能なスクリプトを好みますが、これが不可能な場合は完全な構文を使用できます。pacmaticpacmanshzsh

(はい、エイリアスを追加すると、この問題を簡単に解決できることがわかります--color autopacmaticしかし、正しい方法でやりたいです™。)

インターネット検索とマニュアルページを閲覧しようとしましたが、役に立ちませんでした。

答え1

エイリアス置換は、対話型ソースから行を読み取る場合にのみ実行されます。したがって、2番目の別名は最初の別名の影響を受けないため、リテラル置換です。

たぶん次のようなものがあります。

PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
    PACMAN=pacmatic
fi

# Colorized Pacman output
alias pacman="${PACMAN} --color auto"

これにより 'pacman' が正しい値に設定され、PACMAN 環境変数はエクスポートされないため、スクリプトが完了すると消えます。移動する。

私は同様のアプローチを使用します。

PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"

デフォルトでは、環境変数PACMANを設定し、パスでpacmaticをテストし、見つかった場合はPACMANを設定し、エイリアスを定義します。

まあ、もう少し最適化することはできますが…

which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"

ダダ! PACMANが設定されていないか空の場合は「pacman」に設定され、それ以外の場合はPACMANの値に設定され、「which」行を介してpacmaticに設定されます。

答え2

シェルはalias非常によく似ています#define。つまり、シェルエイリアスを再定義すると、以前のエイリアスが上書きされます。

正しい方法が何であるかよくわかりませんが、1つの方法は、引数を受け入れるシェル関数を使用してそれを使用してエイリアスを作成することです。コードスニペットは次のように書き直すことができます。

if [ -f /usr/bin/pacmatic ]; then
    pacman() { pacmatic "$@"; }
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

 


また、別のエイリアスを使用し、そのうちの1つを使用して別のエイリアスを定義しようとしても、エイリアスはデフォルトでは非対話モードで拡張されないため、機能しません。設定で有効にする必要があります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).

答え3

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'

答え4

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 "$@"
)

別名は鳥の別名です。

関連情報