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 which
verwenden möchte um zu sehen, wo mein vim
ist /grep
/ls
/etc kommt, der Alias steht im Weg:
$ which vim
vim: aliased to vim -X
Dies ist eine nützliche Ausgabe, aber in diesem Fall nicht das, wonach ich suche. Ich kenne vim
wird zu vim -X
aliasiert aber ich will wissen wo das vim
kommt aus.
Ohne den Alias vorübergehend zu de-definieren, nur damit ich which
verwenden kann gibt es eine einfache Möglichkeit, which
zu haben den Alias ‚auspacken‘ und sich selbst darauf ausführen?
Bearbeiten: Es scheint, dass which
ist ein Shell-Built-In mit unterschiedlichen Verhaltensweisen in verschiedenen Shells. In Bash, SiegeX’ Vorschlag des --skip-alias
Flagge funktioniert; Ich bin jedoch auf Zsh. Gibt es dort etwas Ähnliches?
Akzeptierte Antwort:
which
ist eigentlich ein schlechter Weg, um solche Dinge zu tun, da es auf der Grundlage von $SHELL
Vermutungen über Ihre Umgebung anstellt und die Startdateien (denkt sie), die die Shell verwendet; Es rät nicht nur manchmal falsch, sondern Sie können ihm im Allgemeinen nicht sagen, dass es sich anders verhalten soll. (which
auf meinem Ubuntu 10.10 versteht --skip-alias
nicht wie zum Beispiel von @SiegeX erwähnt.) type
verwendet die aktuelle Shell-Umgebung, anstatt in Ihren Konfigurationsdateien herumzustochern, und kann angewiesen werden, Teile dieser Umgebung zu ignorieren, sodass es Ihnen zeigt, was tatsächlich passieren wird, anstatt was bei einer Rekonstruktion Ihrer Standard-Shell passieren würde.
Geben Sie in diesem Fall type -P
ein umgeht alle Aliase oder Funktionen:
$ type -P vim
/usr/bin/vim
Sie können es auch bitten, alles abzuziehen die Ebenen nacheinander und zeigen Ihnen, was es finden würde:
$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim
(Erweitern Sie dies aus den Kommentaren:)
Das Problem mit which
ist, dass es normalerweise ein externes Programm anstelle einer eingebauten Shell ist, was bedeutet, dass es Ihre Aliase oder Funktionen nicht sehen kann und versuchen muss, sie aus den Start-/Konfigurationsdateien der Shell zu rekonstruieren. (Wenn es sich um eine eingebaute Shell handelt, wie es in zsh
der Fall ist aber anscheinend nicht bash
, ist es wahrscheinlicher, die Umgebung der Shell zu verwenden und das Richtige zu tun.)
type
ist ein POSIX-kompatibler Befehl, der sich so verhalten muss, als wäre er eingebaut (d. h. er muss die Umgebung der Shell verwenden, von der er aufgerufen wird, einschließlich lokaler Aliase und Funktionen), also ist ein eingebautes.
Es wird im Allgemeinen nicht in csh
gefunden /tcsh
, obwohl in den meisten modernen Versionen dieser which
ist eine eingebaute Shell und macht das Richtige; manchmal ist das eingebaute which
stattdessen, und manchmal gibt es keine gute Möglichkeit, die Umgebung der aktuellen Shell von csh
aus zu sehen /tcsh
überhaupt.