In meinem .profile
(im sh
Emulationsmodus 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/pacmatic
der 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 pacman
wird aufgerufen (Ich möchte pacmatic
einmal überprüft, bei Shell - Start, nicht jedes Mal pacman
ausgeführt wird). Ich würde auch ein sh
portierbares Skript bevorzugen , aber wenn dies nicht möglich ist, können Sie die vollständige zsh
Syntax verwenden.
(Ja, ich bin mir bewusst, dass dies leicht durch Anhängen --color auto
an den pacmatic
Alias 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.
bash
), und sie können sich leicht gegenseitig anrufen.Antworten:
Eine Shell
alias
verhä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:
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
:Zitat aus dem Handbuch:
quelle
type pacman
kehrtpacman is an alias for pacman --color auto
sowohl imsh
Emulationsmodus als auch im einheitlichenzsh
Modus zurück. Es sieht jedoch so aus, als ob die gerade vorgenommene Bearbeitung genau das ist, was ich brauche.setopt aliases
.zsh
. Und die Shell scheint trotzdem interaktiv zu sein.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:
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:
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 ...
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.
quelle
bash
Aliase standardmäßig nicht im nicht interaktiven Modus erweitert werden, aber wie ist das mit "interaktiven Quellen" identisch?In zsh können Sie mithilfe des
aliases
assoziativen Arrays ganz einfach einen Alias anhängen :In anderen Shells müssen Sie die Ausgabe des
alias
Befehls verwenden, um vorhandene Aliase zu ermitteln.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
pacmatic
oderpacman
in Gebrauch ist.quelle
Eine Kurzversion für den 2. Alias wäre:
quelle
Aliase sind für die Vögel.
quelle