Czy istnieje prosty sposób na wyświetlenie listy wszystkich konfliktów poleceń, które wystąpiły w systemie z powodu aktualizacji bashrc obejmującej polecenia aliasu?
Na przykład ktoś pisze alias ls=/path/to/user-generated/executable
w języku bashrc. Jak dowiadujemy się, że to maskuje rzeczywiste polecenie ( ls
). Jednym ze sposobów wydaje się być uruchomienie wszystkich aliasów przed i po sashcingu bashrc i różnicowanie wyniku. Czy są jakieś lepsze sposoby?
Używam Ubuntu 12.04.
bash --version
GNU bash, wersja 4.2.24 (1) -release (i686-pc-linux-gnu)
Odpowiedzi:
Aby dowiedzieć się, które polecenia są maskowane przez aliasy, wykonaj następujące czynności:
Wyjaśnienie
alias
sam wyświetla listę zdefiniowanych aliasów ised
wypakowuje ich nazwy. Pętla while działatype -ta
na każdym z nich iawk
drukuje linie zawierające zarówno alias, jak i plik.źródło
Możesz użyć,
type
aby dowiedzieć się, jak polecenie będzie interpretowane przez bash.źródło
type ls
drukujels is aliased to `ls --color=auto'
tutaj.which
, ale nie mam teraz, jeśli oba wbudowane powłoki (typ, który) są takie same.type which
mówiwhich is /usr/bin/which
, więc nie jest to wbudowane. Dlatego nie można powiedzieć, czy coś jest wbudowane, czy nie (np. Wwhich echo
porównaniu ztype echo
).type which
which is a shell builtin
używam zsh.Jako pierwsze pytanie nie ma sposobu, aby wyświetlić listę konfliktów, ponieważ bash korzysta wewnętrznie z tabeli skrótów, rejestruje tylko ostatnie przesłonięcie.
Aby dowiedzieć się, czy polecenie jest aliasem, użyj
alias ls
w swoim przypadku, jeśli mówi coś w stylu „nie znaleziono”, to nie jest to alias, w przeciwnym razie jest.Aby uruchomić oryginalną funkcję bez względu na alias, prefiks ukośnika, np.
\ls
Uruchomi prawdziwy haszowany ls, zignoruj alias.EDYTOWAĆ
Jeśli chcesz szybko dowiedzieć się, czy polecenie jest aliasem, możesz włączyć tryb debugowania do
set -x
, teraz, jeśli wykonaszls
:Zobaczysz wyjście debugowania wykonywanego polecenia
Aby wyłączyć tryb debugowania, użyj
set -
źródło
alias
roli. Co jeśli użytkownik nie wie, że istnieje polecenie (np.ls
)? Jedyne, co wydaje się wiedzieć po uruchomieniu,alias ls
to to, do czego jest mapowane, a nie to, z czym było pierwotnie mapowane. Myślę, że trzeba będzie uruchomić wszystkie polecenia zi bez \, aby znaleźć konflikty.Możesz użyć wbudowanego basha,
compgen
aby uzyskać listę wszystkich używanych poleceń i wszystkich aliasówcompgen -ac
. Każde polecenie, które jest również aliasem, zostanie powielone na tej liście, więc prostym naiwnym rozwiązaniem jest poszukiwanie duplikatów na wyjściucompgen -ac
.Jednak duplikaty mogą się również pojawić, jeśli polecenie znajduje się dwukrotnie na ścieżce. Na przykład mam
/bin/which
i/usr/bin/which
takcompgen -ac
wymienięwhich
dwa razy, mimo że nie jest to alias.Potrzebne jest więc pobranie wszystkich duplikatów
compgen -ac
i porównanie ich z listą aliasów. Jedynymi duplikatami, które są również aliasami, są te aliasy, które ukrywają polecenia. Możemy to zrobić za pomocącomm(1)
polecenia i podstawienia procesu bash.compgen -a | sort
jest listą wszystkich aliasów (posortowanychcomm
).compgen -ac | sort | uniq -d
to lista wszystkich duplikatów z listy poleceń i aliasów.comm -12
wyprowadza tylko te linie, które są wspólne dla obu.źródło
Możesz użyć funkcji debugowania powłoki, aby zobaczyć dokładnie, co się dzieje, gdy bash wywołuje interaktywną powłokę. Poniższe informacje powinny pokazywać wszystkie aliasy przypisane podczas odradzania się powłoki interaktywnej z powłoki logowania:
-x
-> włącz debugowanie-l
-> powłoka logowania-i
-> interaktywna powłoka-c
-> polecenieUruchomienie polecenia exit jest wymagane, aby powłoka powróciła. Jest
-i
to wymagane w tym przypadku, ponieważ bash nie skonfigurowałby środowiska interaktywnego do uruchomienia polecenia w przeciwnym razie.Oto przykład z mojego systemu:
Aby zobaczyć, który plik był ostatnio pozyskiwany, gdy został przypisany alias w celu ustalenia pliku, w którym wystąpił, możesz rozszerzyć grep:
Może to zwracać wyniki fałszywie dodatnie, ale powinno być w porządku, jeśli ręcznie sprawdzasz zwrócone dane. Liczba symboli „+” przed wykonanym poleceniem wskazuje głębokość.
W tym przykładzie wyjściowym pokazano, że .bashrc ustawia alias dla
ls
, .foo aliasyt
, a następnie .bashrc zastępuje poprzedni aliast
.źródło