Wie kann ich Shell-Aliase „stapeln“?

12

In meinem .profile(im shEmulationsmodus von meinem .zshrc) habe ich das folgende Snippet:

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

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

Der zweite Alias ​​überschreibt jedoch immer den ersten:

% type pacman
pacman is an alias for pacman --color auto

Wie kann ich es schaffen, dass die zweite Aliaszuweisung die erste "erbt", so dass /usr/bin/pacmaticder Alias , falls vorhanden, wird pacmatic --color auto?

Ich bin nicht abgeneigt, Funktionen anstelle von Alias - Namen verwenden, aber ich würde es vorziehen , wenn die Logik nicht jedes Mal ausgeführt pacmanwird aufgerufen (Ich möchte pacmaticeinmal überprüft, bei Shell - Start, nicht jedes Mal pacmanausgeführt wird). Ich würde auch ein shportierbares Skript bevorzugen , aber wenn dies nicht möglich ist, können Sie die vollständige zshSyntax verwenden.

(Ja, ich bin mir bewusst, dass dies leicht durch Anhängen --color autoan den pacmaticAlias gelöst werden kann . Aber ich möchte es auf die richtige Art und Weise tun.)

Ich habe versucht, zu googeln und die Hilfeseiten durchzusehen, aber ohne Erfolg.

strugee
quelle
Ich dachte, der richtige Weg wäre, Funktionen anstelle von Aliasen zu verwenden. Ich habe gehört, dass sie schneller als Aliase sind (zumindest in bash), und sie können sich leicht gegenseitig anrufen.
Wutaz

Antworten:

5

Eine Shell aliasverhält sich ziemlich ähnlich wie eine #define, dh die Neudefinition eines Shell-Alias ​​würde den vorherigen Alias ​​überschreiben.

Ich bin sicher nicht das, was der richtige Weg wäre , TM , aber ein Ansatz würde die Verwendung einer Shell - Funktion werden machen , die Parameter und die Verwendung dieser akzeptiert einen Aliasnamen zu erstellen. Ihr Code-Snippet könnte wie folgt umgeschrieben werden:

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

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

 


Selbst wenn Sie verschiedene Aliase verwenden und versuchen, eines zum Definieren des anderen zu verwenden, funktioniert dies nicht, da Aliase standardmäßig nicht im nicht interaktiven Modus erweitert werden. Sie müssen es aktivieren, indem Sie Folgendes festlegen expand_aliases:

shopt -s expand_aliases

Zitat aus dem Handbuch:

   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).
devnull
quelle
Dies scheint am ehesten mit dem übereinzustimmen, was ich möchte, aber es funktioniert nicht. type pacmankehrt pacman is an alias for pacman --color autosowohl im shEmulationsmodus als auch im einheitlichen zshModus zurück. Es sieht jedoch so aus, als ob die gerade vorgenommene Bearbeitung genau das ist, was ich brauche.
Strugee
FWIW ist das zsh-Äquivalent setopt aliases.
Strugee
OP verwendet zsh. Und die Shell scheint trotzdem interaktiv zu sein.
Mikel
6

Die Alias-Ersetzung wird nur beim Lesen von Zeilen aus interaktiven Quellen durchgeführt. Der zweite Alias ​​wird also nicht vom ersten beeinflusst, daher der wörtliche Ersatz.

Vielleicht etwas Ähnliches:

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

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

Dadurch wird 'pacman' auf den richtigen Wert gesetzt, die PACMAN-Umgebungsvariable wird nicht exportiert, sodass sie nach Abschluss des Skripts nicht mehr angezeigt wird. Die Verwendung von "doppelten Anführungszeichen" stellt sicher, dass die Variable bei der Deklaration des Alias ​​ersetzt wird. nicht für jeden Aufruf.

Ich benutze eine ähnliche Methode:

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

Stellen Sie im Allgemeinen die Umgebungsvariable PACMAN ein, testen Sie den pacmatic-Pfad, und legen Sie, falls vorhanden, PACMAN fest und definieren Sie dann einen Alias.

Hmm, du könntest ein bisschen mehr optimieren ...

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

Taa Daa! Auf 'pacman' setzen, wenn PACMAN nicht gesetzt oder null ist, andernfalls auf den Wert von PACMAN setzen, der durch die Zeile 'which' auf pacmatic gesetzt wird.

Lornix
quelle
Warum sollten Aliase nur für "interaktive Quellen" funktionieren?
Mikel
Sie haben Recht, dass bashAliase standardmäßig nicht im nicht interaktiven Modus erweitert werden, aber wie ist das mit "interaktiven Quellen" identisch?
Mikel
2

In zsh können Sie mithilfe des aliasesassoziativen Arrays ganz einfach einen Alias ​​anhängen :

alias pacman="${aliases[pacman]-pacman} --color auto"

In anderen Shells müssen Sie die Ausgabe des aliasBefehls verwenden, um vorhandene Aliase zu ermitteln.

current_pacman_alias=$(alias pacman 2>/dev/null)
alias pacman="${current_pacman_alias:-pacman} --color auto"

Während ich dies als Möglichkeit anbiete, würde ich eine Variable verwenden, wie bereits in anderen Antworten vorgeschlagen. Es ist klarer, und Sie können auf den Wert der Variablen unterscheiden , wenn Sie einige Dinge zu konfigurierenden anders basierend auf dem eines der pacmaticoder pacmanin Gebrauch ist.

pacman==pacmatic 2>/dev/null || pacman=pacman
alias pacman='$pacman --color auto'
Gilles 'SO - hör auf böse zu sein'
quelle
0

Eine Kurzversion für den 2. Alias ​​wäre:

alias pacman=$PACMAN' --color auto'
Michael Durrant
quelle
0
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 "$@"
)

Aliase sind für die Vögel.

mikeserv
quelle