O bash pode mostrar a definição de uma função?

262

Existe uma maneira de visualizar a definição de uma função bash no bash?

Por exemplo, digamos que eu defini a função foobar

function foobar {
    echo "I'm foobar"
}

Existe alguma maneira de obter mais tarde o código que foobaré executado?

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

Respostas:

357

Use type. Se foobaré definido, por exemplo, no seu ~/.profile:

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

Isso descobre o que foobarera e, se foi definido como uma função, chama declare -fcomo explicado por pmohandras.

Para imprimir apenas o corpo da função (ou seja, o código), use sed:

type foobar | sed '1,3d;$d'
Benjamin Bannier
fonte
2
@sjsupersumit A pergunta pede explicitamente uma solução Bash.
precisa saber é o seguinte
210

Você pode exibir a definição de uma função no bash usando declare. Por exemplo:

declare -f foobar
pmohandas
fonte
1
Ótimo, direto ao ponto, funciona mesmo quando funções definidas em outros arquivos de script carregados. Funciona também no zsh.
Diego Nemo
2
Trabalhos com conchas velhas em sistemas não-Linux se você usartypeset -f
Emmanuel
É bom também que apenas mostre a functiondefinição, para que você não precise analisar se é isso que deseja.
Ribamar # 7/18
5
set | sed -n '/^foobar ()/,/^}/p'

Isso basicamente imprime as linhas do seu comando set começando com o nome da função foobar () e terminando com}

Jurgen van der Mark
fonte
4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

com foobar sendo o nome da função.

piroscópio
fonte
4
problema: exibirá apenas o primeiro "}", o que não é tudo, sempre que a definição contiver aninhamentos "{...}" que, de fato, o Bash permite.
Arquiteto do Destino
1
Também pode falhar se a função contiver uma string here-doc / here contendo o padrão de chaves
Cheetah