Nie mogę dowiedzieć się, jak znaleźć plik, w którym zdefiniowano funkcję bash ( __git_ps1
w moim przypadku).
I eksperymentował z declare
, type
, which
, ale nic mi mówi plik źródłowy. Czytałem gdzieś, gdzie declare
można wydrukować nazwę pliku i numer linii, ale nie wyjaśniono, jak to zrobić. help
Aktualizacja declare
nie mówi, albo.
Jak mogę uzyskać te informacje?
$PATH
,type
nie będzie działać. Możesz spróbować po prostu użyćfind
lublocate
.locate
będzie znacznie szybszy, ponieważ wykorzystuje wcześniej istniejącą bazę danych, ale nie będzie działać, jeśli polecenie zostało zainstalowane niedawno.Odpowiedzi:
Jeśli jesteś przygotowany do uruchomienia funkcji, możesz uzyskać informacje, używając
set -x
do śledzenia wykonania i ustawieniaPS4
zmiennej.Rozpocznij bash
--debugger
lub użyj,shopt -s extdebug
aby zapisać dodatkowe informacje debugowania.Ustaw
PS4
„monit” drukowany podczas śledzenia, aby pokazać linię źródłową.Włącz śledzenie.
możesz następnie uruchomić swoją funkcję i dla każdej linii otrzymasz nazwę pliku funkcji.
Użyj,
set +x
aby wyłączyć śledzenie.Więc w tym przypadku uciekłbyś
źródło
Jeśli nie chcesz uruchomić tej funkcji, nadal możesz skonfigurować debugowanie i uzyskać informacje. Kroki są
bash --debugger
lubshopt -s extdebug
przed zdefiniowaniem funkcji.declare -F __git_ps1
i poinformuje, gdzie funkcja jest zdefiniowana.
Zalety tej metody w porównaniu z podglądem śledzenia wykonania z adnotacjami w PS4 są
Zalety śledzenia wykonania są
Ja zdecydowanie polecam uwzględniając
shopt -s extdebug
na początku zarówno~/.bashrc
i~/.bash_profile
na pokrycie różnych plików używanych w różnych inwokacja przypadkach.źródło
shopt -s extdebug
zostanie wywołany po zdefiniowaniu funkcji. Uwaga: numery linii mogą być wyłączone (bieżący błąd), jeśli funkcja zostanie zadeklarowana poprzezeval
.bash --debugger
jak musiałem aktywować ukończenie, aby zdefiniować funkcję uzupełniania i uzyskać raport zdeclare -F _vpnc
.Świetne rozwiązanie @ icarus działa dla funkcji, o ile są one zdefiniowane dosłownie, a nie wynik
eval
zawartości innego pliku (w którym plik zeval
zostanie wyświetlony jako źródło). Nie będzie drukować pliku źródłowego aliasów, wbudowanych powłok (jakecho
) i plików wykonywalnych (binarnych lub nie) i uważam, że te informacje nie są ogólnie dostępne. Niektóre polecenia mogą wydrukować swoje pliki źródłowe (a nawet mogą być zgodne z prawdą), w trakcie normalnego wykonania lub w odpowiedzi na sygnał.__git_ps1
jest zdefiniowany w/usr/share/git/git-prompt.sh
i/usr/share/git/completion/git-prompt.sh
w moim systemie, Arch Linux, więc może to być to samo dla Ciebie.Zajrzyj do sekcji Wywołanie,
man bash
jeśli chcesz poszukać poleceń specjalnie na początku powłoki - mogą one pozyskiwać inne pliki, które z kolei źródło innych plików.źródło
bash
?$HOME/.bashrc
i w$HOME/.profile
. Zobacz: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html, który wyjaśnia niektóre szczegóły dotyczące tego, kiedy i jak pozyskiwany jest każdy plik./etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
, Oraz treść$ENV
i$BASH_ENV
muszą być dodany do listy.Nie wydaje się to możliwe
bash
, ale jest wzsh
:źródło
find
/locate
/grep
.~/.whatever
domyślnie tych samych plików, co bash, i daje przydatne odpowiedzi tylko dla funkcji zdefiniowanych we wspólnych lokalizacjach, takich jak w tym przypadku, które nie są ponownie zdefiniowane~/.bashrc
ani nic takiego .Zadeklaruj funkcję o tej samej nazwie i ustaw ją tylko do odczytu tak wcześnie, jak to możliwe, a następnie włącz tryb xtrace, taki jak:
Następnie po zalogowaniu zobaczysz informacje śledzenia, które obejmują pozyskiwanie plików. W momencie próby deklaracji istniejącej funkcji tylko do odczytu pojawi się komunikat o błędzie. Ostatni pobrany plik powinien zawierać deklarację, której szukasz.
Może być konieczne umieszczenie tego w profilu bash systemu. Pamiętaj również, aby cofnąć zmiany po znalezieniu sprawcy.
źródło
Próbowałeś tego?
lub dowolne z innych dostępnych tutaj poleceń:
Jak znaleźć wszystkie pliki zawierające określony tekst w systemie Linux? | Przepełnienie stosu
Wydaje się, że muszę ci wyjaśnić więcej. Twoje pytanie brzmi: „Jeśli więc uruchomisz następujące polecenie, powinno ono zwrócić wszystkie pliki, w których zdefiniowano funkcję bash.
Programowanie BASH - Funkcje | Projekt dokumentacji systemu Linux
źródło