web-dev-qa-db-ja.com

シェルエイリアスを「スタック」するにはどうすればよいですか?

私の.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 autopacmaticエイリアスに追加することで簡単に解決できることを認識しています。しかし、RightWay™で実行したいと思います。)

グーグルしてマンページを調べてみましたが、役に立ちませんでした。

12
strugee

シェル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).
5
devnull

エイリアス置換は、インタラクティブソースから行を読み取る場合にのみ実行されます。したがって、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に設定します。

6
lornix

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'
0
Michael Durrant
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 "$@"
)

エイリアスは鳥用です。

0
mikeserv