Ist es möglich zu überprüfen, wo ein Alias ​​definiert wurde?

24

Ein Alias, wie er llmit dem aliasBefehl definiert wird .

Ich kann den Befehl mit Dingen wie type lldem Ausdrucken überprüfen

ll is aliased to `ls -l --color=auto'

oder command -v llwelche druckt

alias ll='ls -l --color=auto'

oder alias llwas auch druckt

alias ll='ls -l --color=auto'

aber ich kann scheinbar nicht finden, wo der Alias ​​definiert wurde, dh eine Datei wie .bashrcoder vielleicht manuell in der laufenden Shell. An dieser Stelle bin ich mir nicht sicher, ob dies überhaupt möglich ist.

Sollte ich einfach alle Dateien durchgehen, die von geladen wurden, bashund jede einzelne davon überprüfen?

Polemon
quelle
Aus der Manschette würde ich sagen rennenbash -xl
Jeff Schaller

Antworten:

21

Manuelle Definitionen sind schwer zu erkennen (vielleicht die Verlaufsprotokolle), obwohl die Shell gefragt wird, was sie tut grep, um die in einer RC-Datei gesetzten zu finden:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

Wenn die Shell die erforderlichen Optionen mit einem der oben genannten Aufrufe (die den Befehl null interaktiv ausführen) nicht genau erfasst, gilt Folgendes script:

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

Eine andere Möglichkeit wäre, etwas wie straceoder sysdigzu verwenden, um alle Dateien zu finden, die die Shell berührt, und diese dann grepmanuell zu öffnen (praktisch, wenn die Shell oder das Programm kein -xFlag haben). Die Standard-RC-Dateien reichen nicht für eine manuelle Überprüfung der Dateinamen aus, wenn so etwas wie oh-my-zsh oder standortspezifische Konfigurationen Code von who know where einlesen (oder auch Umgebungsvariablen, wie sorontar in ihrer Antwort hervorhebt). .

Thrig
quelle
Vielen Dank! Obwohl die Ausgabe etwas schwer zu analysieren ist, habe ich die Datei gefunden, die den gesuchten Alias ​​definiert. Wenn der Alias ​​an keiner Stelle in dieser Liste vorhanden ist, ist es dann sicher anzunehmen, dass der Alias ​​manuell definiert wurde?
Polemon
@polemon etwas sicher; Es könnte in einer Datei definiert sein (oder gewesen sein), die nicht eingelesen wird, weil wer weiß, warum oder wurde sie gelöscht (vor allem, wenn es eine Art Shell-Framework gibt, das die Komplexität erhöht, die der Benutzer nicht hat) verstehen).
Am
1
Um den Punkt, an dem der Alias ​​definiert ist, leichter zu finden, können Sie PS4 verwenden, das jeder Zeile in einer Ablaufverfolgung vorangestellt wird:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick,
5

Hier finde ich grep -rlsehr nützlich:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

wird Ihnen sagen, in welcher Datei das Wort aliasverwendet wird.

Wahrscheinlich in ~/.bashrcund mit Sicherheit in, ~/.bash_aliaseswenn es existiert.


Es ist jedoch unmöglich, absolut sicher zu sein, dass dies alle Optionen abdeckt. Diese Dateien können auch andere Dateien aufrufen oder laden. Eine Umgebungsvariable wie ENV oder $BASH_ENVkann bash anweisen, einige andere Dateien zu laden.

sucht in der Umgebung nach der Variablen BASH_ENV, erweitert ihren Wert, wenn sie dort angezeigt wird, und verwendet den erweiterten Wert als Namen einer Datei, die gelesen und ausgeführt werden soll.

Und Aliase können sogar durch Setzen einer Variablen definiert werden (Hervorhebung meiner):

BASH_ALIASES
Eine assoziative Array-Variable, deren Mitglieder der internen Liste der Aliase entsprechen, die vom eingebauten Alias ​​verwaltet werden. Zu diesem Array hinzugefügte Elemente werden in der Aliasliste angezeigt

Sorontar
quelle
grep -rl alias ~/.bash*stimmt möglicherweise fälschlicherweise mit Verlaufsdateien überein, aber +1, um auf das Array BASH_ALIASES hinzuweisen!
Jeff Schaller
2

Ich kenne keine Möglichkeit, die Quelle Ihrer Aliase tatsächlich aufzulisten, aber da es so aussieht, als würden Sie bash verwenden, denke ich, dass dies die möglichen Quelldateien sind:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

Sie sollten in der Lage sein, diese zu durchsuchen, um den Alias ​​zu finden, z grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.

edaemon
quelle
Oder Dateien von dort enthalten ...
Jeff Schaller
@ JeffSchaller - Richtig, dafür bräuchten Sie etwas Komplexeres, wie Sie sagten bash -x. Ich dachte, dass das oben Genannte einfach genug ist, um schnell zu laufen, und wenn es den Alias ​​nicht findet, können Sie die Ausführungsschritte durchlesen.
Edaemon
1

Wenn Sie die Antwort von thrig mit dem Vorschlag von @ MarkPlotnick kombinieren , können Sie testen, ob diese Option aktiviert ist, um sie einzugrenzenBASH_ALIASES[ll] . Das BASH_SOURCEArray und die LINENOVariablen sind hier besonders nützlich. Leider wird die Überprüfung, ob gesetzt BASH_ALIASES[ll]ist, erst erfolgreich sein, nachdem der Alias ​​gesetzt wurde, und so könnte sich die erste solche Zeile in einer anderen Datei befinden.

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

Ausgabe geben wie:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

Sie können die Shell sogar mit dieser Prüfung beenden:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
muru
quelle
0

Ich hatte Erfolg einfach mit which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
Charles Clayton
quelle
1
whichKann Aliase in tcsh (und vielleicht in früheren csh) und zsh verarbeiten, wo es ein eingebautes ist, und in bash mit dem Standardprofil der RedHat-Familie, das einen Klumpen hat, um das (externe) GNU-Programm auszuführen, aber es mit Shell-Aliasdaten zu versorgen, andernfalls nicht . Wichtiger ist, dass nur angegeben wird, auf was der Alias ​​festgelegt ist, nicht, wo er festgelegt wurde, was hier das Q war.
Dave_thompson_085
-1

Überprüfen Sie ~ / .profile, wenn es sich nicht in ~ / .bashrc befindet

Michael Tatum
quelle
Oder Dateien von dort enthalten ...
Jeff Schaller
-1

Endlich habe ich die llAlias-Definition für unseren Webserver (CentOS) in zwei Shell-Skripten gefunden /etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

Ich fand es , indem man zuerst das Lernen aus den Kommentaren oben , wo das systemweite Profil war: /etc/profile. Diese Datei gibt an, dass systemweite Aliase in definiert sind /etc/bashrc, und in dieser Datei habe ich gesehen, dass sie mehrere Shell-Skripte durchläuft. Also /etc/profile.d/habe ich sie grepin diesem Verzeichnis verwendet und schließlich die Definitionen gefunden. Ich habe auch festgestellt, dass es einen l.Alias ​​gibt, der alle Punktedateien auflistet:

Von colorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(Es gibt äquivalente Aliase in colorls.csh.)

Jordan Bradford
quelle
-1

Verwenden Sie zuerst die folgenden Befehle

Alle Funktionen auflisten

functions 

Alle Aliase auflisten

alias 

Wenn Sie den Alias ​​oder die Funktion nicht finden, ziehen Sie eine aggressivere Suchmethode in Betracht

Bash-Version

bash -ixlc : 2>&1 | grep thingToSearchHere

Zsh-Version

zsh -ixc : 2>&1 | grep thingToSearchHere

Kurze Erläuterung der Optionen

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
jasonleonhard
quelle