Bash può mostrare la definizione di una funzione?


262

C'è un modo per visualizzare la definizione di una funzione bash in bash?

Ad esempio, supponiamo che abbia definito la funzione foobar

function foobar {
    echo "I'm foobar"
}

C'è un modo per ottenere in seguito il codice che foobarviene eseguito?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

Risposte:


357

Usa type. Se foobarè ad esempio definito nel tuo ~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

Questo scopre cos'era foobare se è stata definita come una funzione, chiama declare -fcome spiegato da pmohandras.

Per stampare solo il corpo della funzione (cioè il codice) usare sed:

type foobar | sed '1,3d;$d'

2
@sjsupersumit La domanda richiede esplicitamente una soluzione Bash.
bfontaine,

210

Puoi visualizzare la definizione di una funzione in bash usando declare. Per esempio:

declare -f foobar

1
Ottimo, al punto, funziona anche quando le funzioni sono definite in altri file di script caricati. Funziona anche in zsh.
Diego Nemo,

2
Funziona con vecchie shell su sistemi non Linux se usitypeset -f
Emmanuel

buono anche che mostra solo la functiondefinizione, quindi non devi analizzare se è quello che vuoi.
Ribamar

5
set | sed -n '/^foobar ()/,/^}/p'

Questo in pratica stampa le righe dal comando set che iniziano con il nome della funzione foobar () e terminano con}


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

con foobar come nome della funzione.


4
problema: verrà visualizzato solo fino al primo "}", che non è tutto ogni volta che la definizione contiene annidamenti di "{...}" che in effetti Bash consente.
Destiny Architect,

1
Può anche fallire se la funzione contiene una stringa qui-doc / qui contenente il modello parentesi graffa
Ghepardo,
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.