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"

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'

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

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}


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

com foobar sendo o nome da função.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.