Czy można sprawdzić, gdzie zdefiniowano alias?

24

Alias, taki jak llzdefiniowany w aliaspoleceniu.

Mogę sprawdzić polecenie za pomocą takich rzeczy, type llktóre drukuje

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

lub command -v llktóry drukuje

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

lub alias llktóry również drukuje

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

ale nie mogę znaleźć miejsca, w którym zdefiniowano alias, tj. pliku takiego jak .bashrc, a może ręcznie w uruchomionej powłoce. W tym momencie nie jestem pewien, czy to w ogóle możliwe.

Czy powinienem po prostu przejrzeć wszystkie załadowane pliki bashi sprawdzić każdy z nich?

polemon
źródło
Z kajdanek powiedziałbym, że uciekajbash -xl
Jeff Schaller

Odpowiedzi:

21

Ręczna definicja będzie trudna do wykrycia (być może dzienniki historii), chociaż poprosi powłokę o pokazanie, co robi, a następnie greppowinna pomóc znaleźć te ustawione w pliku rc:

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

Jeśli powłoka nie przechwytuje dokładnie niezbędnych opcji za pomocą jednej z powyższych wywołań (które interaktywnie uruchamiają polecenie null), to script:

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

Inną opcją byłoby użycie czegoś takiego stracelub sysdigznalezienie wszystkich plików, których dotknie powłoka, a następnie przejście do grepnich ręcznie (przydatne, jeśli powłoka lub program nie ma -xflagi); standardowe pliki RC nie są wystarczające do ręcznego sprawdzenia nazwy pliku, jeśli coś takiego jak oh-my-zsh lub konfiguracje specyficzne dla witryny pobierają kod od tego, kto wie, gdzie (lub też mogą istnieć zmienne środowiskowe, jak wskazuje sorontar w odpowiedzi) .

gałązka
źródło
Dzięki! Mimo że dane wyjściowe są nieco trudne do przeanalizowania, ale znalazłem plik, który zdefiniował szukany alias. Jeśli alias nie jest nigdzie na liście, czy można bezpiecznie założyć, że alias został zdefiniowany ręcznie?
polemon
@polemon nieco bezpieczny; może być (lub został) zdefiniowany w pliku, który nie jest wczytywany z powodu tego, kto wie, co-powód-lub-został usunięty (szczególnie jeśli istnieje jakiś szkielet powłoki, który zwiększa złożoność, której użytkownik nie Rozumiesz).
thrig
1
Aby uczynić punkt, w którym alias jest nieco łatwiejszy do znalezienia, możesz użyć PS4, który jest dodawany do każdej linii w śladzie:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick
5

Oto, co uważam za grep -rlbardzo przydatne:

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

powie ci, w którym pliku aliasjest użyte słowo .

Prawdopodobnie w, ~/.bashrca na pewno w, ~/.bash_aliasesjeśli istnieje.


Nie można jednak mieć absolutnej pewności, że obejmuje to wszystkie opcje. Pliki te mogą także wywoływać lub ładować inne pliki. Zmienna środowiskowa, taka jak ENV lub $BASH_ENVmoże skierować bash, aby załadować inne pliki.

szuka zmiennej BASH_ENV w środowisku, rozszerza jej wartość, jeśli się tam pojawia, i wykorzystuje rozszerzoną wartość jako nazwę pliku do odczytu i wykonania.

Aliasy można nawet zdefiniować, ustawiając zmienną (moje wyróżnienie):

BASH_ALIASES
Zmienna tablicy asocjacyjnej, której elementy odpowiadają wewnętrznej liście aliasów obsługiwanej przez wbudowany alias. Elementy dodane do tej tablicy pojawiają się na liście aliasów

sorontar
źródło
grep -rl alias ~/.bash*może fałszywie pasować do plików historii, ale +1 za wskazanie tablicy BASH_ALIASES!
Jeff Schaller
2

Nie znam sposobu, aby wyświetlić listę źródeł twoich aliasów, ale ponieważ wygląda na to, że używasz bash, myślę, że są to możliwe pliki źródłowe:

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

Powinieneś być w stanie przeszukiwać te, aby znaleźć alias, np grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.

edaemon
źródło
Lub dołączone pliki stamtąd ...
Jeff Schaller
@JeffSchaller - Tak bash -x, jak już wspomniałeś , potrzebujesz czegoś bardziej złożonego . Uznałem, że powyższe jest dość łatwe do uruchomienia, a jeśli nie znajdzie aliasu, możesz przeczytać kroki wykonania.
edaemon,
1

Łącząc odpowiedź thrig jest z @ sugestią MarkPlotnick jest , można sprawdzić, czy BASH_ALIASES[ll]ustawiony jest sprowadzić. BASH_SOURCEArray LINENOzmienne są tu szczególnie użyteczne. Niestety sprawdzenie, czy BASH_ALIASES[ll]jest ustawiony, zakończy się powodzeniem dopiero po ustawieniu aliasu, więc pierwsza taka linia może znajdować się w innym pliku.

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

Dając wynik taki jak:

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

Możesz nawet zakończyć powłokę za pomocą tego sprawdzenia:

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

Po prostu odniosłem sukces which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
Charles Clayton
źródło
1
whichpotrafi obsługiwać aliasy w tcsh (i może wcześniejszym csh) i zsh, gdzie jest wbudowany, oraz w bash przy użyciu domyślnego profilu w rodzinie RedHat, która ma kludge do uruchomienia (zewnętrznego) programu GNU, ale podaje mu aliasy powłoki, w przeciwnym razie nie . Co ważniejsze, mówi tylko, do czego ustawiony jest alias, a nie tam , gdzie został ustawiony, czyli tutaj Q.
dave_thompson_085
-1

Sprawdź ~ / .profile, jeśli nie ma go w ~ / .bashrc

Michael Tatum
źródło
Lub dołączone pliki stamtąd ...
Jeff Schaller
-1

W końcu znalazłem lldefinicję aliasu dla naszego serwera WWW (CentOS) w dwóch skryptach powłoki w /etc/profile.d/:

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

Znalazłem go przez pierwsze nauki z powyższych uwag gdzie profil całego systemu było: /etc/profile. Ten plik stwierdza, że ​​w systemie są zdefiniowane aliasy systemowe /etc/bashrc, aw tym pliku widziałem, że przechodzi on przez kilka skryptów powłoki /etc/profile.d/, więc użyłem greptego katalogu i w końcu znalazłem definicje. Odkryłem również, że istnieje l.alias, który wyświetla wszystkie pliki kropek:

Od 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

(Istnieją równoważne aliasy w colorls.csh.)

Jordan Bradford
źródło
-1

Najpierw użyj następujących poleceń

Wyświetl wszystkie funkcje

functions 

Wyświetl wszystkie aliasy

alias 

Jeśli nie możesz znaleźć aliasu lub funkcji, rozważ bardziej agresywną metodę wyszukiwania

Wersja Bash

bash -ixlc : 2>&1 | grep thingToSearchHere

Wersja Zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

Krótkie objaśnienie opcji

-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
źródło