Como você lista todas as funções e aliases em um script específico?

5

Eu tenho um script que está ficando bastante longo. Seria legal se eu pudesse listar todas as funções nele. Ainda melhor seria listar o nome da função e qualquer documentação sobre seu uso, por exemplo, parâmetros.

    
por Hexatonic 07.02.2016 / 20:02

2 respostas

2

Em geral, é impossível listar todas as funções sem executar o script, porque uma função poderia ser declarada por algo como eval $(/some/program) . Mas se as funções forem declaradas "normalmente", você pode pesquisar coisas que se parecem com definições de funções.

grep -E '^[[:space:]]*([[:alnum:]_]+[[:space:]]*\(\)|function[[:space:]]+[[:alnum:]_]+)' myscript

Não há função de digitação ou documentação nos scripts de shell, então qualquer documentação teria que vir de comentários. Aqui está um trecho bruto de Perl que extrai definições de funções formatadas comumente, bem como comentários imediatamente anteriores ou posteriores.

perl -0777 -ne '
    while (/^((?:[ \t]*\#.*\n)*)               # preceding comments
             [ \t]*(?:(\w+)[ \t]*\(\)|         # foo ()
                      function[ \t]+(\w+).*)   # function foo
             ((?:\n[ \t]+\#.*)*)               # following comments
           /mgx) {
        $name = "$2$3";
        $comments = "$1$4";
        $comments =~ s/^[ \t]*#+/#/mg;
        chomp($comments);
        print "$name\n$comments\n";
    }' myscript

Uma maneira mais precisa de imprimir nomes de funções, se você puder executar o script sem causar efeitos colaterais, ou se puder isolar todas as definições de funções em um subscrito, é executar o script e então fazer bash imprimir toda a função definições. Ao contrário do método de pesquisa de texto acima, isso inclui definições de função de formato estranho e exclui falsos positivos (por exemplo, aqui nos documentos), mas isso não pode encontrar comentários.

bash -c '. myscript; typeset -f'
    
por 08.02.2016 / 01:26
6

A maneira usual é usar declare -f , que imprimirá uma lista muito longa de funções em um shell bash interativo. Mas dentro de um script, como a maioria das funções externas não estão definidas, a lista será curta e útil.

Então:

declare -f

Listará funções (e definições). E:

declare -F

imprime apenas uma lista de funções de nome.

Existe uma opção (não tão fácil de usar) de extdebug que, se definida, os números de linha da definição de cada função também serão impressos por declare -F . Mas extdebug precisa ser definido no tempo de carregamento do script (como todas as linhas precisam ser conhecidas para poder listá-las).

    
por 07.02.2016 / 23:56

Tags