Trovare la definizione di una funzione bash


41

Lavoro in un ambiente che ha molta magia di script shell legacy in giro. Una cosa usata pesantemente dalla riga di comando sono le funzioni bash che provengono da alcuni file inclusi da alcuni file inclusi da alcuni file ... inclusi nel mio .bash_profile. C'è un modo per ottenere la definizione o anche meglio la posizione della definizione di queste funzioni senza rintracciarle attraverso 5 livelli di inclusioni?

Risposte:



66

Supponendo di avere una funzione denominata foo i comandi seguenti otterranno la posizione della definizione della funzione, ovvero otterrà il nome del file in cui è definita la funzione e il numero di riga in cui la funzione è definita all'interno di quel file .

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Nel mio caso l'output di questi comandi è:

foo 32 /source/private/main/developer/cue.pub.sh

3
Perfezionare. L'ho appena trasformato in una funzione bash nel mio file bashrc. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil,

5
@Neil: È utile, grazie: lasciami suggerire di usare una subshell per localizzare l'effetto shoptsenza cambiare lo stato della shell corrente: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(nota l'uso di (...)invece di {...}).
mklement0

Perché quei comandi non funzionano da uno script? funzione funziona correttamente
albfan

1
Questa dovrebbe essere la risposta accettata.
sciolto il

11

Per vedere la definizione della funzione (al contrario di da dove proviene), usare:

declare -f <functionname>

Penso che questo sia migliore di type -aperché non stampa la prima riga fastidiosa dipendente dalle
impostazioni

1
ma dato che non è stata data alcuna posizione, questa è una risposta a una domanda non posta - almeno non richiesta qui
iconoclasta il

6

bash -xscaricherà quale bash è in esecuzione all'avvio, il che dovrebbe consentire di rintracciarlo più facilmente. Non dimenticare di uscire dalla shell appena aperta.


Roba pratica; per acquisire la traccia in un file, utilizzare script out.txt bash -x(di nuovo, non dimenticare di exit).
mklement0

-2

un altro modo, che trovo ancora più semplice ultimamente:

  which <functionname>

(questo mostrerà anche se si tratta di un alias o di uno script, ma non rintraccerà la fonte di un alias)


2
Non credo che whichfornisca informazioni sugli alias su BSD o mac. Inoltre, questa domanda riguarda le funzioni e whichnon fornisce informazioni sulle funzioni.
dbn

Grazie per quella nota. Vedo ora che "quale" risolve solo le funzioni in zsh, non in bash.
Joshua Goldberg,

2
Penso che questa risposta possa probabilmente invitare a votare ... non sembra rispondere affatto alla domanda, dato che non ci sono informazioni sulla posizione.
iconoclasta il

Ho trovato utile allo scopo di rintracciare la dichiarazione per utilizzarlo e scoprire se si tratta di un alias o di una funzione e di conoscere la sintassi con cui è stata dichiarata. È vero però che solo la risposta di @ HairOfTheDog fornisce direttamente il file.
Joshua Goldberg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.