Pracuję w środowisku, w którym jest dużo starszej magii skryptów powłoki. Jedną z rzeczy często używanych w wierszu poleceń są funkcje bash, które pochodzą z jakiegoś pliku zawartego z jakiegoś pliku zawartego z jakiegoś pliku ... zawartego w moim pliku .bash_profile. Czy istnieje sposób na uzyskanie definicji, a nawet lepszą lokalizację definicji tych funkcji bez śledzenia ich za pomocą 5 poziomów dołączeń?
41
whence -f function_name
inzsh
Zakładając, że masz funkcję o nazwie foo, poniższe polecenia otrzymają lokalizację definicji funkcji, to znaczy, że otrzyma nazwę pliku, w którym funkcja jest zdefiniowana, a także numer linii, pod którą funkcja jest zdefiniowana w tym pliku .
W moim przypadku dane wyjściowe tych poleceń to:
źródło
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
bez zmiany stanu bieżącej powłoki:whichfunc () ( shopt -s extdebug; declare -F "$1"; )
(zwróć uwagę na użycie(...)
zamiast zamiast{...}
).Aby zobaczyć definicję funkcji (w przeciwieństwie do jej pochodzenia), użyj:
źródło
type -a
dlatego, że nie drukuje pierwszej linii zależnej od ustawień irytujących lokalizacji ~~bash -x
zrzuci uruchamiany bash podczas uruchamiania, co powinno ułatwić jego prześledzenie. Nie zapomnij wyjść z nowo otwartej powłoki.źródło
script out.txt bash -x
(ponownie, nie zapomnijexit
).inny sposób, który ostatnio wydaje mi się jeszcze prostszy:
(pokaże to także, czy jest to alias, czy skrypt, ale nie wyśledzi źródła aliasu)
źródło
which
zawierał informacje o aliasach na BSD lub Mac. To pytanie dotyczy także funkcji iwhich
nie zawiera informacji o funkcjach.