Listar todos os programas usados por um shell script

8

Estou tentando descobrir um método para listar todos os programas que um script usará quando for executado, sem realmente executá-lo.

Eu escrevi esses oneliners rápidos e sujos:

# fill an array with all the useful words except variables, options, brackets, quotes
readarray -t list <<<$( grep -v '^#' script.sh | sed 's/[0-9a-zA-Z_\-]*=//g ; s/\${.*}//g ; s/\$(//g ; s/[)'\"\'\'']//g ; s/ --*.//g ' )

# for every word in array show info with 'type' and clean the output again
for p in "${list[@]}" ; do type "${p}" ; done 2>&1 | grep -v -e '^bash:' -e 'shell keyword' -e 'shell builtin' | sort | uniq | sed 's/^.* //g ; s/[\(\)]//g'

Eu acho que os problemas são:

  1. Se o programa não estiver instalado, o 'tipo' falhará
  2. Aqui, os documentos podem conter palavras-chave que podem ser programas ...
  3. Se o script não estiver bem escrito, a dificuldade pode aumentar ('shellcheck' pode ser útil)
  4. Arquivos de configuração externa e bibliotecas de funções não são rastreados (consulte o comentário do ilkkachu)

Alguma solução melhor?

    
por baselab 18.12.2017 / 10:44

2 respostas

1

No post # 16 do tópico link Eu postei um script perl de 150 linhas p1.txt que pode ser um ponto de partida útil. Eu também adicionei um link para um analisador de shell muito mais completo e complexo

Pode ser melhor olhar para o tópico inteiro - talvez alguns outros pontos de vista também possam ser de interesse.

Felicidades ... felicidades, drl

    
por 18.12.2017 / 19:14
0

Esta não é uma tarefa fácil. Você já identificou várias das dificuldades. A análise baseada em texto é muito propensa a erros, muito fácil de contornar (se alguém quiser) e quase garantida de estar incompleta.

O Bash tem uma função interna 'set' que analisa o script sem realmente executá-lo. Isso pode ajudá-lo, mas mesmo isso será limitado.

  [set] -n      Read commands but do not execute them.  This may be used
                  to  check  a  shell  script  for syntax errors.  This is
                  ignored by interactive shells.

Para testá-lo em um script, basta adicionar set -n no início do script e executá-lo.

strace será muito útil, mas exige que o script seja realmente executado, o que é algo que você quer fazer depois de ter certeza de que o script está seguro.

    
por 19.02.2018 / 19:09