Posso obter todas as funções em um arquivo de script, usando o bash?

0

Se eu tiver um arquivo:
dome.sh

$ls -l dome.sh
-rwxrwxr-x 1 user user 0 Aug  8 11:19 dome.sh

e o conteúdo do arquivo é semelhante a:

#!/bin/bash
function() {
    'work'
    }
another() {
    'different work'
    }
...
#30 functions later
yetANOTHERfunction () {
    'even more work'
    }

em que "# 30 funciona mais tarde" significa que existem 30 funções adicionais exclusivas

Posso de alguma forma iterar através de todas as funções deste script para identificá-las?

algo como:

for i in $(get all functions in this file); do
    echo $i
done

para produzir:

function
another
...
yetANOTHERfunction
    
por spezticle 08.08.2016 / 18:26

2 respostas

1

Se você capitalizar o "F" em "declare -F", ele retornará linhas como "declare -f functionName". Agora tudo que você precisa fazer é cortar a primeira parte dessa linha. Aqui está o código:

#!/bin/bash
function () {
   return
}
another () {
   return
}
yetANOTHERfunction () {
   return
}
IFS=$'\n'
for f in $(declare -F); do
   echo "${f:11}"
done
    
por 25.08.2016 / 20:30
0

Tente:

get_fcn_list () {
    env -i bash --noprofile --norc -c '
    source "'"$1"'"
    typeset -f |
    grep '\''^[^{} ].* () $'\'' |
    awk "{print \}" |
    while read -r fcn_name; do
        type "$fcn_name" | head -n 1 | grep -q "is a function$" || continue
        echo "$fcn_name"
    done
'
}

for fcn_name in $(get_fcn_list dome.sh); do
    echo "$fcn_name"
done

Explicação:

  • Em vez de analisar as funções sozinho, deixe bash analisá-las (com source ) e despejar o conteúdo ( typeset -f ).

  • A invocação env -i bash --noprofile --norc deve impedir que bash leia todos os arquivos de inicialização. Caso contrário, você pode obter funções definidas em, por exemplo, ~/.bashrc .

  • typeset -f irá despejar todas as funções e suas definições. Cada definição começa com: nome da função , espaço , () , espaço , nova linha . grep e awk extraem os nomes das funções dessas linhas.

  • O motivo do filtro é que você pode obter falsos positivos quando tiver funções como:

    f () 
    { 
        echo "
    a () 
    "
    }
    

    Aqui, o loop while erroneamente imprime a , mas o filtro cuida disso.

  • Editado para imprimir funções do arquivo e evitar incluir arquivos de inicialização.

por 08.08.2016 / 19:32