Como depurar o script bash?

28

Existe alguma maneira de depurar o script bash sem usar echo e logging?

Estou falando de usar pontos de interrupção e coisas assim.

    
por UAdapter 11.01.2011 / 23:18

7 respostas

18

Sim, existe o Projeto Bash Debugger .

Vocêtambémpodeusarset-xeset-vnaexecução. AQUI e AQUI ou AQUI é alguma informação sobre isso.

boa sorte!

    
por danizmax 11.01.2011 / 23:44
20

Existem várias maneiras diferentes, por exemplo:

  • Execute o seu script com a opção -x

    bash -x yourscript.sh
    
  • Adicione set -x em uma nova linha no início do seu arquivo de script após o Shebang #!/bin/bash e antes do início do seu script, set -v exibirá as linhas de entrada do shell, set -x exibirá as linhas executadas comandos e argumentos

  • substitua o shebang do seu arquivo de script por #!/bin/bash -xv

por NES 11.01.2011 / 23:40
6

o shellcheck é o melhor da cidade -

link

você também pode integrar com o vim, aqui está o repositório do git -

link

    
por ramgorur 15.05.2015 / 08:09
6

Atualmente, há a extensão de Depuração de Bash do Visual Studio Code . Tem 'Step in / out / over' e pode mostrar o valor de cada variável.

    
por Henrique Lemos Ribeiro 22.02.2017 / 20:55
3

Você pode usar essa pequena função para acessar o "console":

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    CMD=""
    while [[ $CMD != "exit" ]]; do
        read -p "> " CMD
        case $CMD in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval $CMD;;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

Então, dentro do seu script (EXEMPLO):

for FILE in *; do
...
   if [[ $FILE == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

Ele aceita qualquer comando, mantendo as variáveis locais intactas. Para sair do modo "debug", digite "exit" (não sairá do script) e ele continuará com o código. Se você usar "debug" dentro de um loop, ele irá parar a cada vez. Você pode envolvê-lo em um "if" (como no exemplo acima) ou criar uma função "watch":

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch $FILE "strange_case.txt"

Também adicionei o comando "vars", que despeja todas as variáveis disponíveis e seus valores. Você também pode adicionar seus próprios comandos personalizados.

Eu fiz o código em poucos minutos, então use-o por sua conta e risco. Esteja ciente de que no modo de depuração, qualquer comando pode ser executado, por isso, representa um risco de segurança se você o deixar em um script de produção.

    
por lepe 15.05.2015 / 07:47
1

Uma opção GUI para depurar um script bash é o IDE do Eclipse com os plashins BashEclipse / Shelt.

Isso fornece os recursos da sua pergunta ( breakpoints and stuff ) junto com uma série de outros recursos para depurar scripts complexos do bash.

Algumas das funcionalidades incluem: ( link )

  • Alternar ponto de quebra
  • Operação passo-a-passo única
  • Step-in, Step-out, funções de sobreposição e sub-rotinas
  • Examinando variáveis de código a qualquer momento enquanto o script está sendo executado
  • lista de tarefas TODO
  • lista de marcadores
  • Edição de várias janelas
  • Compartilhamento remoto do ambiente do projeto

A perspectiva do Editor de scripts:

Aperspectivadedepuração:

As etapas de uso são adicionar Shelled e BashEclipse pluggins ao eclipse. Em seguida, execute o procedimento fornecido no arquivo de texto leia-me do BashEclipse para iniciar o depurador.

    
por L. D. James 18.08.2016 / 10:22
1

Ao som do que o NES está dizendo, existem flags no bash para permitir a depuração.

O sinalizador set -x pode ser definido e não configurado no terminal ou no script. Usando + ou - :

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

Aqui está o que os comandos set fazem:

  • set -f Desabilita a geração de nome de arquivo usando metacaracteres.
  • set -v Imprime (verbose) as linhas de entrada do shell à medida que são lidas.
  • set -x Imprimir rastreios de comando antes de executar o comando.

set na verdade tem muitos recursos, mas lamentavelmente nenhuma página man como é um shell embutido na ferramenta. O manual do conjunto está em a documentação do GNU Bash .

Existem inúmeras ferramentas de linha de comando que podem ajudá-lo a obter detalhes sobre seu programa, como:

  • stat exibir arquivo ou status do sistema de arquivos
  • file determina um tipo de arquivo.
  • hexdump filter, que exibe os arquivos especificados em vários formatos
  • nohup Executa um script que não é interrompido

    e muitos outros. Eu estava tentando pensar no comando que mostra caracteres ocultos, mas não posso fazer isso agora. O Hexdump fará isso, mas existe um melhor.

O comando de teclas ctrl \ fará com que um programa ou script em execução seja esvaziado. Então você poderia analisar o coredump. Eu provavelmente usaria o gdb para analisar um coredump, mas existem muitos programas para isso.

O shell bash tem algumas opções interessantes para depuração também. opções --debugger , -v verbose, --dump-strings e outras opções interessantes para ajudá-lo. Confira-os usando man bash .

O comando trap (shell integrado) pode ser muito útil para você. trap diz que se o seu programa sair inesperadamente, execute algo. Você leu sobre o trap e outros recursos úteis do Bash Shell aqui .

Falando geralmente no momento, a depuração é um tópico enorme em qualquer idioma. Alguns outros tópicos que podem ser úteis para depuração em qualquer linguagem de programação incluem, redirecionamento de shell e processamento de sinal.

Por fim, percebo que o exemplo que usei é trivial, mas alguns scripts de shell podem ter centenas de linhas. Nessas situações, gosto de inserir tags de comentários e bloquear o código que suspeito estar com defeito ou, alternativamente, inserir um comando de saída e tentar isolar o código funcional do código quebrado, usando uma técnica de dividir e conquistar.

    
por j0h 26.04.2014 / 03:43