Gibt es eine einfache Möglichkeit, alle Befehlskonflikte aufzulisten, die aufgrund des bashrc-Updates mit Aliasbefehlen im System aufgetreten sind?
Zum Beispiel schreibt jemand alias ls=/path/to/user-generated/executable
in bashrc. Wie findet man heraus, dass dies ein tatsächliches Kommando maskiert ( ls
). Eine Möglichkeit scheint darin zu bestehen, alle Aliase vor und nach dem Sourcing von bashrc auszuführen und die Ausgabe zu differenzieren. Gibt es bessere Möglichkeiten?
Ich verwende Ubuntu 12.04.
bash --version
GNU Bash, Version 4.2.24 (1) -Release (i686-pc-linux-gnu)
Antworten:
Gehen Sie folgendermaßen vor, um herauszufinden, welche Befehle von Aliasen maskiert werden:
Erläuterung
alias
alone listet definierte Aliase auf undsed
extrahiert deren Namen. Die while-Schleife wirdtype -ta
auf jedem von ihnen ausgeführt und gibtawk
die Zeilen aus, die sowohl einen Alias als auch eine Datei enthalten.quelle
Mit können Sie
type
herausfinden, wie ein Befehl von bash interpretiert wird.quelle
type ls
drucktls is aliased to `ls --color=auto'
hier.which
, aber ich weiß jetzt nicht, ob beide (Typ, welcher) Shell-Buildins gleich sind.type which
sagt dirwhich is /usr/bin/which
, es ist also kein eingebautes. Daher kann es Ihnen nicht sagen, ob etwas eingebaut ist oder nicht (z . B.which echo
versustype echo
).type which
which is a shell builtin
Ich verwende die zsh.Als erste Frage gibt es keine Möglichkeit, die Konflikte aufzulisten, da bash intern eine Hash-Tabelle verwendet und nur die letzte Überschreibung aufzeichnet.
Um herauszufinden, ob es sich bei einem Befehl um einen Alias handelt, verwenden Sie
alias ls
in Ihrem Fall Folgendes: Wenn der Befehl "nicht gefunden" anzeigt, ist er kein Alias, andernfalls ist er es.Um die ursprüngliche Funktion ohne Berücksichtigung des Alias zu starten, muss ein Schrägstrich vorangestellt werden, z. B.
\ls
wird das echte Hash-ls gestartet, und der Alias wird ignoriert.BEARBEITEN
Wenn Sie schnell wissen möchten, ob ein Befehl ein Alias ist, können Sie den Debugging-Modus aktivieren, indem Sie
set -x
jetzt Folgendes ausführenls
:Sie sehen eine Debug-Ausgabe des real ausgeführten Befehls
Verwenden Sie, um den Debug-Modus zu deaktivieren
set -
quelle
alias
Teil nicht bekommen . Was ist, wenn ein Benutzer nicht weiß, dass ein Befehl vorhanden ist (z. B.ls
)? Nach dem Laufen scheint er nur zu wissen,alias ls
worauf es abgebildet ist und nicht, womit es ursprünglich abgebildet wurde. Ich denke, man muss alle Befehle mit und ohne \ ausführen, um Konflikte zu finden.Sie können die integrierte Bash-Funktion verwenden
compgen
, um eine Liste aller Befehle und Aliase abzurufen , die verwendet werdencompgen -ac
. Jeder Befehl, der auch ein Alias ist, wird in dieser Liste dupliziert. Die einfache, naive Lösung besteht darin, in der Ausgabe von nach Duplikaten zu suchencompgen -ac
.Es können jedoch auch Duplikate auftreten, wenn sich ein Befehl zweimal auf dem Pfad befindet. Zum Beispiel, ich habe
/bin/which
und/usr/bin/which
socompgen -ac
wird eine Listewhich
zweimal , auch wenn es nicht ein Alias ist.Sie müssen also alle Duplikate abrufen
compgen -ac
und diese mit einer Liste von Aliasen vergleichen. Nur Duplikate, die auch Aliase sind, sind Aliase, die Befehle verbergen. Wir können dies mit demcomm(1)
Befehl und mit der Ersetzung des Bash-Prozesses tun .compgen -a | sort
ist die Liste aller Aliase (sortiert nachcomm
).compgen -ac | sort | uniq -d
ist die Liste aller Duplikate aus der Liste der Befehle und Aliase.comm -12
gibt nur die Zeilen aus, die beiden gemeinsam sind.quelle
Sie können die Shell-Debugging-Funktion verwenden, um genau zu sehen, was passiert, wenn Bash eine interaktive Shell aufruft. Das Folgende sollte Ihnen alle Aliase anzeigen, die zugewiesen werden, wenn eine interaktive Shell aus einer Anmeldeshell erzeugt wird:
-x
-> Debugging aktivieren-l
-> Login-Shell-i
-> interaktive Shell-c
-> befehlDas Ausführen des Befehlsexits ist erforderlich, damit die Shell zurückkehrt. Das
-i
ist in diesem Fall nicht erforderlich , da bash würde nicht eine interaktive Umgebung einrichten sonst einen Befehl auszuführen.Hier ist ein Beispiel aus meinem System:
Um zu sehen, welche Datei zuletzt bezogen wurde, als der Alias zugewiesen wurde, um die aufgetretene Datei zu bestimmen, können Sie grep erweitern:
Dies kann zu Fehlalarmen führen, sollte jedoch in Ordnung sein, wenn Sie die zurückgegebenen Daten manuell überprüfen. Die Anzahl der '+' - Symbole vor dem ausgeführten Befehl gibt die Tiefe an.
In dieser Beispielausgabe wird gezeigt, dass .bashrc einen Alias für
ls
.foo-Aliase festlegtt
und anschließend .bashrc den vorherigen Alias für überschreibtt
.quelle