Wie teste ich auf mögliche Konflikte, während ich Alias ​​in bashrc verwende?

12

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/executablein 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)

user13107
quelle
Als Randnotiz ist es für die Antwortenden in der Regel hilfreicher, wenn Sie Ihre Version von bash bereitstellen, als die Betriebssystemversion, wenn Sie eine bestimmte Frage zu bash stellen.
Jordanien
@jordanm Aktualisiert.
user13107

Antworten:

8

Gehen Sie folgendermaßen vor, um herauszufinden, welche Befehle von Aliasen maskiert werden:

alias | sed 's/^[^ ]* *\|=.*$//g' | while read a; do
  printf "%20.20s : %s\n" $a "$(type -ta $a | tr '\n' ' ')"
done | awk -F: '$2 ~ /file/'

Erläuterung

aliasalone listet definierte Aliase auf und sedextrahiert deren Namen. Die while-Schleife wird type -taauf jedem von ihnen ausgeführt und gibt awkdie Zeilen aus, die sowohl einen Alias ​​als auch eine Datei enthalten.

Thor
quelle
15

Mit können Sie typeherausfinden, wie ein Befehl von bash interpretiert wird.

Choroba
quelle
Zum Beispiel type lsdruckt ls is aliased to `ls --color=auto'hier.
l0b0
Dasselbe funktioniert mit which, aber ich weiß jetzt nicht, ob beide (Typ, welcher) Shell-Buildins gleich sind.
Mathe
@math: type whichsagt dir which is /usr/bin/which, es ist also kein eingebautes. Daher kann es Ihnen nicht sagen, ob etwas eingebaut ist oder nicht (z . B. which echoversus type echo).
Choroba
Ich denke, es hängt von der verwendeten Shell ab: type which which is a shell builtinIch verwende die zsh.
Mathe
@math: Die ursprüngliche Frage ist mit / bash markiert.
Choroba
7

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 lsin 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. \lswird 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 -xjetzt Folgendes ausführen ls:

Bildbeschreibung hier eingeben

Sie sehen eine Debug-Ausgabe des real ausgeführten Befehls

Verwenden Sie, um den Debug-Modus zu deaktivieren set -

Gänseblümchen
quelle
Vielen Dank. Aber habe das aliasTeil 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 lsworauf 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.
user13107
@ user13107 hat die Antwort aktualisiert
daisy
Vielen Dank. Wie deaktiviere ich die Ablaufverfolgung?
user13107
@ user13107 erneut aktualisiert ;-P
daisy
1
"Es gibt keine Möglichkeit, die Konflikte aufzulisten" - Sie sind einfach nicht einfallsreich genug.
camh
6

Sie können die integrierte Bash-Funktion verwenden compgen, um eine Liste aller Befehle und Aliase abzurufen , die verwendet werden compgen -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 suchen compgen -ac.

Es können jedoch auch Duplikate auftreten, wenn sich ein Befehl zweimal auf dem Pfad befindet. Zum Beispiel, ich habe /bin/whichund /usr/bin/whichso compgen -acwird eine Liste whichzweimal , auch wenn es nicht ein Alias ist.

Sie müssen also alle Duplikate abrufen compgen -acund diese mit einer Liste von Aliasen vergleichen. Nur Duplikate, die auch Aliase sind, sind Aliase, die Befehle verbergen. Wir können dies mit dem comm(1)Befehl und mit der Ersetzung des Bash-Prozesses tun .

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sortist die Liste aller Aliase (sortiert nach comm). compgen -ac | sort | uniq -dist die Liste aller Duplikate aus der Liste der Befehle und Aliase. comm -12gibt nur die Zeilen aus, die beiden gemeinsam sind.

camh
quelle
5

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:

bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
  • -x -> Debugging aktivieren
  • -l -> Login-Shell
  • -i -> interaktive Shell
  • -c -> befehl

Das Ausführen des Befehlsexits ist erforderlich, damit die Shell zurückkehrt. Das -iist 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:

$ bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
++ alias 'ls=ls --color=auto'
$ alias -p
alias ls='ls --color=auto'

Um zu sehen, welche Datei zuletzt bezogen wurde, als der Alias ​​zugewiesen wurde, um die aufgetretene Datei zu bestimmen, können Sie grep erweitern:

bash -x -l -i -c 'exit' 2>&1 | grep -E ' (alias|[.]|source) '

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.

+ . /home/jordan/.bashrc
++ alias 'ls=ls --color=auto'
++ . /home/jordan/.foo
+++ alias t=test
++ alias t=test2

In dieser Beispielausgabe wird gezeigt, dass .bashrc einen Alias ​​für ls.foo-Aliase festlegt tund anschließend .bashrc den vorherigen Alias ​​für überschreibt t.

Jordanien
quelle
Vielen Dank. Dies ist sicherlich nützlich, kann aber nicht erkennen, wie der Konflikt gefunden wird, bei dem Aliase erstellt werden.
user13107
@ user13107 Ich habe einige weitere Details hinzugefügt, die hilfreich sein sollten. Das Setzen eines Alias ​​auf einen neuen Wert ist kein "widersprüchlicher" Alias. Es ist ein normales dokumentiertes Verhalten, weshalb ein Rundweg erforderlich ist.
Jordanien