Wie die meisten Benutzer habe ich eine Reihe von Aliasen eingerichtet, um einen Standardsatz von Flags für häufig verwendete Programme bereitzustellen. Zum Beispiel,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Das Problem ist, dass, wenn ich verwenden möchte, um which
zu sehen, woher mein vim
/ grep
/ ls
/ etc kommt, der Alias im Weg steht:
$ which vim
vim: aliased to vim -X
Dies ist eine nützliche Ausgabe, aber in diesem Fall nicht das, wonach ich suche. Ich weiß, es vim
ist ein Alias, vim -X
aber ich möchte wissen, woher das vim
kommt.
Gibt which
es eine einfache Möglichkeit which
, den Alias zu "entpacken" und sich selbst darauf auszuführen, ohne den Alias vorübergehend zu deaktivieren, damit ich ihn verwenden kann ?
Bearbeiten: Es scheint, dass which
es sich um eine Shell handelt, die über verschiedene Shells hinweg unterschiedliche Verhaltensweisen aufweist. In Bash funktioniert der Vorschlag von SiegeX für die --skip-alias
Flagge. Ich bin jedoch auf Zsh. Gibt es dort etwas Ähnliches?
vim
kommt , würden Sie verwendenwhere vim
Antworten:
which
Dies ist in der Tat eine schlechte Methode, da hiermit eine Vermutung über Ihre Umgebung$SHELL
und die von der Shell verwendeten Startdateien angestellt wird. Es wird nicht nur manchmal falsch geraten, man kann es auch nicht generell dazu bringen, sich anders zu verhalten. (which
Auf meinem Ubuntu 10.10 wird dies--skip-alias
zum Beispiel von @SiegeX nicht verstanden .)type
Verwendet die aktuelle Shell-Umgebung, anstatt auf Ihre Konfigurationsdateien zuzugreifen, und kann angewiesen werden, Teile dieser Umgebung zu ignorieren, sodass angezeigt wird, was tatsächlich geschieht passieren, anstatt was bei einer Rekonstruktion Ihrer Standard-Shell passieren würde.In diesem Fall
type -P
werden alle Aliase oder Funktionen umgangen:Sie können ihn auch bitten, alle Schichten nacheinander abzuziehen und Ihnen zu zeigen, was sie finden würden:
(Erweitere dies aus den Kommentaren :)
Das Problem dabei
which
ist, dass es sich in der Regel um ein externes Programm anstelle einer integrierten Shell handelt. Dies bedeutet, dass Ihre Aliase oder Funktionen nicht angezeigt werden und dass versucht werden muss, sie aus den Startup- / Konfigurationsdateien der Shell zu rekonstruieren. (Wenn es sich um eine eingebaute Shell handelt, wie sie sichzsh
anscheinendbash
in der Shell befindet, ist es wahrscheinlicher, dass sie die Umgebung der Shell nutzt und das Richtige tut.)type
ist ein POSIX-kompatiblen Befehl, wenn es eine eingebaute in waren verhalten erforderlich ist , wie, so ist es in der Regel (das heißt, es die Umgebung der Schale aus , einschließlich der lokalen Alias - Namen und Funktionen es aufgerufen verwenden müssen) ist ein eingebaut.Es ist im Allgemeinen nicht in
csh
/ zu findentcsh
, obwohl es in den meisten modernen Versionenwhich
eine eingebaute Shell ist und das Richtige tut; Manchmal istwhat
stattdessen die integrierte Shell vorhanden, und manchmal gibt es keine gute Möglichkeit, die aktuelle Shell-Umgebung voncsh
/ austcsh
zu sehen.quelle
type -a
anscheinend alle Instanzen auf deiner zurückkommen$PATH
, nicht nur die erste. Ich denke , ich werde alias :)which
type
type
Teil des POSIX-Standards ist, ist dies der richtige Weg. Um meine Frage zu beantworten, tippe works auch auf zsh (auf Debian). Warum werden die Distributionen nicht entferntwhat
undwhich
wenn sie nicht standardisiert sind und keine zusätzlichen Funktionen haben?info bash 'Bash builtins'
Linux beginnen, obwohl Sie es auch aus demzsh
Referenzhandbuch erhalten können. Offizieller gesagt , pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (was ich nicht wirklich spezifiziere-P
oder-a
sogar-p
was die ursprüngliche Form war-P
, aber erfordert, dass es die aktuelle Shell-Umgebung verwendet).type -p
verhält sich zwischen zsh und bash unterschiedlich.type -P
existiert überhaupt nicht in zsh.In
bash
:In
zsh
:Sowohl:
Oder:
quelle
In zsh
which
ist folgendes eingebaut:Verwenden Sie den vollständigen Pfad, um den externen Befehl (in einer beliebigen Shell) auszuführen :
which
Somit wurde der Befehl
ls
gefunden (ein Exit-Wert von 0) und befindet sich bei/bin/ls
.Innen
zsh
; Eine Möglichkeit (neben der obigen), nach externen Befehlen zu suchen , ist:Verschachtelte Aliase wie die folgenden werden jedoch nicht aufgelöst:
Der Befehl meldet, dass kein
dire
Befehl gefunden wurde.Informationen zum Auflösen verschachtelter Aliase (manuell) finden Sie unter
Resolve nested aliases to their source commands
quelle
Meine als solche definiert
quelle
Versuche Folgendes:
quelle
which
es sich tatsächlich um eine integrierte Shell und nicht um ein reguläres Unix-Dienstprogramm handelt, wie ich angenommen hatte. Also sollte ich meine Frage bearbeiten und Zsh angeben. Danke, dass du mich darauf hingewiesen hast!which
ist kein Builtin, zumindest nicht auf Debian. Es ist ein Shell-Skript und Teil von debianutils, funktioniert also auf zsh. Allerdings--skip-alias
ist daswhich
unter Debian keine Option . Gibt es verschiedene Arten vonwhich
herumschweben? Dies scheint kein standardisierter Befehl zu sein.man zshbuiltins
. welchen [-wpams] Namen ... Entspricht woher -c.bash
es nicht eingebaut und hat keine--skip-alias
Option./usr/bin/which
und ein Alias/etc/profile.d
, mit dem Aliase behandelt werden können, der jedoch--skip-alias
funktioniert. Als Ergebniswhich which
zeigt das Alias,command which which
zeigt aber die ausführbare Datei!Eine andere Alternative ist
command which vim
, die in beidenzsh
und auf die gleiche Weise funktioniertbash
ZB auf meinem Mac:
quelle
Beide
type
undwhich
verhalten sich je nach Shell-Typ unterschiedlich.In der Bash
which
ist ein Befehl in vorhandenPATH
. Es durchsucht den Befehl, den Sie eingebenPATH
. Bash builtintype -P
(P forPATH
) verhält sich genausowhich
.In ZSH sind beides
which
undtype
Builtins und Teilfunktionen von Builtinwhence
.which -p
ist was du willst. Es erzwingt eine Pfadsuche. (-P
Option ist fürtype
ZSH nicht verfügbar .)Mehr aus dem ZSH-Handbuch.
Zum Überspringen
builtin
which
und verwenden Sie den Befehl zu zwingen ,which
vonPATH
in ZSH:quelle