Como depurar um script bash?

How Debug Bash Script




Qualquer programa precisa estar livre de erros antes de chegar aos consumidores. Os desenvolvedores de software fazem o possível para tornar os programas de software livres de erros. Mas é difícil fazer um código sem falhas quando existem milhares de linhas. A depuração é um processo contínuo; ajuda na detecção imediata de erros, reunindo informações valiosas sobre o código e eliminando fragmentos de código redundantes.

Todas as linguagens de programação têm algumas abordagens comuns e poucas abordagens distintas para encontrar bugs. Por exemplo, programas de depuração podem ser usados ​​para remover erros rapidamente. Considerando que o script de shell não tem nenhuma ferramenta específica para depurar o código. Este artigo discute várias técnicas de depuração que podem ser usadas para tornar o script bash livre de erros. Antes de mergulharmos nos métodos, vamos ter uma compreensão básica de shells e scripts de shell:







Qual é o shell no Linux?

Quando você inicializa o computador, o kernel obtém informações sobre o hardware conectado e permite que outros componentes conectados interajam. Além disso, gerencia memória, CPU e reconhece qualquer novo periférico. Resumindo, um kernel é a espinha dorsal de qualquer sistema operacional. Mas você já pensou em interagir diretamente com o kernel, comandá-lo para realizar uma tarefa específica? É mesmo praticável fazer isso? Absolutamente! Com a ajuda de um shell, um programa de computador com interface interativa, qualquer pessoa pode operar o kernel. O shell permite que humanos interajam com o kernel e o instruam a realizar qualquer tarefa.



No Unix, existem dois shells principais Bourne shell e Shell C . Ambos os tipos têm suas subcategorias. Diferentes tipos de conchas Bourne são Korn shell (ksh), Almquist shell (ash), Bourne again shell (bash), e Z shell (zsh) . Ao mesmo tempo, o shell C tem suas próprias subcategorias, como C shell (csh) e Shell TENEX C (tcsh) . Como mencionado acima, de todas as cascas, Bash (Bourne de novo shell) é o shell mais usado e sai da caixa em muitas distribuições Linux devido à sua eficiência e facilidade de uso.



Bash é o shell padrão de muitas distribuições Linux e é amplamente usado por milhões de usuários Linux. É tão diverso e influente que pode executar todas as tarefas que você normalmente executa em aplicativos baseados em GUI. Você pode editar arquivos, gerenciar arquivos, ver fotos, ouvir música, reproduzir vídeos e muito mais.





O que é um Shell Script:

Como aprendemos a ideia básica de shell, agora vamos passar para o script de shell. O script de shell é um programa de computador que executa vários comandos em um shell que atua como um intérprete para executar uma função específica. Conforme discutido acima, existem 2 tipos específicos de shells. No entanto, este guia se concentra no shell Bourne Again (Bash).
Então, o que é um script bash? No Linux, todos os comandos bash são armazenados em / usr / bin e / bin pastas. Por exemplo, sempre que você executa um comando, o bash pesquisa se ele existe no diretório ou não. O comando é executado se for encontrado nos diretórios, caso contrário, ocorrerá um erro.

Que tal realizar uma tarefa que precisa de vários comandos para rodar no terminal? Nessa situação específica, o script bash pode ajudá-lo. O script Bash é uma forma de script shell que permite criar programas para executar vários comandos bash para realizar uma tarefa específica.



O que são bugs no script bash:

Ao trabalhar com script bash ou com qualquer outra linguagem de programação, você encontra muitos erros. Um bug é um erro ou falha no programa que pode fazer com que ele se comporte incorretamente.

Cada linguagem de programação tem seu próprio procedimento para encontrar bugs; da mesma forma, o bash também possui muitas opções integradas para depurar um programa de terminal.

Gerenciar erros e depurar um programa não é menos que um incômodo. É um trabalho demorado e pode piorar se você não estiver ciente das ferramentas certas para depurar seu programa. Este artigo é um guia completo sobre depuração de scripts bash para tornar seu script livre de erros. Então, vamos começar:

Como depurar um script bash:

Ao trabalhar em grandes projetos de programação, você encontra muitos erros ou bugs. Depurar um programa às vezes pode ser complicado. Os programadores geralmente utilizam ferramentas de depuração, e muitos editores de código também auxiliam na localização de bugs destacando a sintaxe.

Existem várias ferramentas no Linux para depurar códigos, por exemplo, GNU Debugger também conhecido como gdb. Ferramentas como GDB são úteis para linguagens de programação que compilam em binários. Como o bash é uma linguagem interpretada simples, não há necessidade de ferramentas pesadas para depurá-la.

Existem várias técnicas tradicionais para depurar um código de script bash, e uma delas é adicionar Asserções. Asserções são condições que são adicionadas aos programas para verificar condições específicas e executar o programa de acordo. É uma técnica defensiva que ajuda a encontrar bugs e testar também. Você pode encontrar muitos Ferramentas que auxiliam na adição de asserções em scripts bash.

Bem, adicionar afirmações é uma das velhas técnicas tradicionais. Existem conjuntos de sinalizadores / opções disponíveis no bash para depurar um script bash. Essas opções podem ser adicionadas junto com o shebang nos scripts ou adicionadas durante a execução do programa no terminal. Os tópicos que abordaremos estão listados abaixo:

  1. Como depurar script bash habilitando verboso -v opção
  2. Como depurar script bash usando xtrace -x opção
  3. Como depurar script bash usando noexec -n opção
  4. Como identificar o variáveis ​​não definidas enquanto depura o script bash
  5. Como depurar o parte específica do script bash
  6. Como depurar um script bash usando o armadilha comando
  7. Como depurar um script bash eliminando arquivo globbing usando o -f opção
  8. Como combinar opções de depuração para depurar um script de shell
  9. Como redirecionar relatório de depuração para um arquivo

Então, vamos verificar várias técnicas em bash para depurar um script bash:

1. Como depurar o script bash ativando a opção -v detalhada:

Uma das abordagens mais fáceis para depurar o script bash é usar o -v opção, também conhecida como detalhada. A opção pode ser adicionada com o shebang ou colocada explicitamente com o nome do arquivo de script durante a execução. A opção verbose irá executar e imprimir cada linha do código como o processo pelo interpretador. Vamos entender isso com um exemplo de script bash:

#! / bin / bash
jogou fora 'Digite o número1'
leituranúmero 1
jogou fora 'Digite o número2'
leituranúmero 2
E se [ '$ numero1' -gt '$ numero2' ]
então
jogou fora 'Número1 é maior que Número2'
elif [ '$ numero1' -eq '$ numero2' ]
então
jogou fora 'Número1 é igual a Número2'
outro
jogou fora 'Número2 é maior que Número1'
ser

O código acima obtém dois números do usuário e, em seguida, executa algumas declarações condicionais para verificar se o número é mais significativo, menor ou igual ao outro número inserido. Embora qualquer editor de texto possa ser usado para scripts bash, estou usando o editor Vim. O Vim é um editor poderoso e rico em recursos que destaca a sintaxe dos scripts bash e reduz as chances de erros de sintaxe. Se você não tiver o editor Vim, obtenha-o executando o comando mencionado abaixo:

$sudoaptoinstalar vim

Crie um arquivo de script bash usando:

$vimb_script.sh

Se você é novo no editor Vim, recomendo que você aprenda como usar o editor vim antes de proceder.

Agora, de volta ao script, execute o script usando -v opção:

$bash -vb_script.sh

Pode-se ver na saída acima que cada linha do script é impressa no terminal à medida que são processadas pelo interpretador. Observe que o script irá parar de receber informações do usuário e, em seguida, processar a próxima linha do script. Como discutido acima, o -v a opção pode ser colocada após shebang conforme mostrado a seguir:

#! / bin / bash -v

Da mesma forma, a sinalização detalhada também pode ser adicionada na próxima linha do shebang usando o definir comando:

#! / bin / bash
definir -v

Qualquer um dos métodos discutidos acima pode permitir verbosidade.

2 Como depurar o script bash usando a opção xtrace -x:

O rastreamento de execução, também conhecido como xtrace, é uma opção de depuração inteligente e útil, especialmente para rastrear erros lógicos. Erros lógicos geralmente estão associados a variáveis ​​e comandos. Para verificar o estado da variável durante a execução do script, usamos o -x opção. Agora, novamente, execute o b_script.sh arquivo com o -x bandeira:

$bash -xb_script.sh

A saída mostra explicitamente o valor de cada variável durante o processo de execução. De novo, o -x pode ser usado ao lado do shebang e após a linha shebang usando o comando set. O xtrace coloca o sinal + em cada linha do script.

3 Como depurar o script bash usando a opção noexec -n:

Erros de sintaxe são uma das principais causas de bugs. Para depurar sintaticamente o script bash, usamos noexec (sem execução) modo. A opção usada para o modo noexec é -n. Ele apenas exibirá os erros de sintaxe do código em vez de executá-lo. Uma abordagem muito mais segura para depurar o código. Vamos executar b_script.sh novamente com o -n opção:

$bash -nb_script.sh

Não haverá execução de código se não houver erro de sintaxe. Agora, vamos modificar nosso código:

#! / bin / bash

jogou fora 'Digite o número1'
leituranúmero 1
jogou fora 'Digite o número2'
leituranúmero 2
E se [ '$ numero1' -gt '$ numero2' ]
então
jogou fora 'Número1 é maior que Número2'
elif [ '$ numero1' -eq '$ numero2' ]
#então
jogou fora 'Número1 é igual a Número2'
outro
jogou fora 'Número2 é maior que Número1'
ser

Estou comentando então depois de elif . Agora, com -n execute b_script.sh roteiro:

$bash -nb_script.sh

Como antecipado, identificou claramente o erro e o exibiu no terminal.

4 Como identificar as variáveis ​​não definidas durante a depuração do script bash:

É comum cometer um erro de digitação ao escrever um código. Freqüentemente, você digita incorretamente uma variável, o que não permite que o código seja executado. Para identificar esse erro, usamos o -você opção. Vamos modificar o código novamente:

#! / bin / bash
jogou fora 'Digite o número1'
leituranúmero 1
jogou fora 'Digite o número2'
leituranúmero 2
E se [ '$ num1' -gt '$ numero2' ]
então
jogou fora 'Número1 é maior que Número2'
elif [ '$ numero1' -eq '$ numero2' ]
então
jogou fora 'Número1 é igual a Número2'
outro
jogou fora 'Número2 é maior que Número1'
ser

Em primeiro E se declaração condicional, renomeei o número 1 variável para num1 . Agora num1 é uma variável não definida. Agora execute o script:

$bash -vocêb_script.sh

A saída identificou e exibe explicitamente o nome de uma variável não definida.

5. Como depurar a parte específica do script bash:

O modo xtrace processa todas as linhas do código e fornece saída. No entanto, encontrar erros em um código grande seria demorado se já sabemos qual parte está potencialmente causando o erro. Felizmente, o xtrace também permite que você depure uma parte específica do código, o que pode ser feito usando o definir comando. Lugar set -x no início da parte que precisa ser depurada e então definir + x no fim. Por exemplo, quero depurar as declarações condicionais de b_script.sh , então irei incluir todas as declarações condicionais em set -x e definir + x opções conforme mostrado no código abaixo:

#! / bin / bash
jogou fora 'Digite o número1'
leituranúmero 1
jogou fora 'Digite o número2'
leituranúmero 2
definir -x
E se [ '$ numero' -gt '$ numero2' ]
então
jogou fora 'Número1 é maior que Número2'
elif [ '$ numero1' -eq '$ numero2' ]
então
jogou fora 'Número1 é igual a Número2'
outro
jogou fora 'Número2 é maior que Número1'
ser
definir+ x

Agora, execute o script usando bash b_script.sh .

A saída é apenas depurar as condições if conforme especificado.

6. Como depurar um script bash usando o comando trap:

Se o seu script for complicado, existem técnicas mais elaboradas também para depuração. Um deles é o armadilha comando. o armadilha O comando capta os sinais e executa um comando quando ocorre uma situação específica. O comando pode ser um sinal ou uma função. Eu criei outro script com o nome de sum_script.sh :

#! / bin / bash
armadilha Linha 'echo' $ {LINENO}: o primeiro número é $ número1, o segundo número é $ número2 e a soma é $ soma ''DEPURAR
jogou fora 'Digite o primeiro número'
leituranúmero 1
jogou fora 'Digite o segundo número'
leituranúmero 2
soma= $[numero1 + numero2]
jogou fora 'a soma é$ soma'

o armadilha comando com DEPURAR sinal exibir o status das variáveis número 1 , número 2 e soma após a execução de cada linha, conforme mostrado na seguinte imagem de saída:

Os blocos amarelos são espaços em branco porque o usuário ainda não inseriu nenhuma entrada; esses espaços serão preenchidos conforme o usuário insere valores. Este método também é bastante útil na depuração de scripts bash.

7. Como depurar um script bash eliminando o agrupamento de arquivos usando a opção -f:

O agrupamento de arquivos é um processo de localização de arquivos com caracteres curinga, ou seja, * e ? . Em muitas situações, você não precisa expandir os arquivos durante a depuração. Nesses casos, você pode bloquear o globbing do arquivo usando o -f opção. Vamos entender isso com um script fglobe_script.sh :

#! / bin / bash
jogou fora 'Exibir todos os arquivos de texto.'
ls *.TXT

O código acima exibirá todos os arquivos de texto no diretório atual, execute:

$bashfglobe_script.sh

Para desligar o globbing de arquivo, use o -f opção:

$bash -ffglobe_script.sh

Da mesma forma, você pode usá-lo com o shebang e com o definir comando também:

#! / bin / bash
jogou fora 'Exibir todos os arquivos de texto.'
ls *.TXT
definir -f
jogou fora 'Exibir todos os arquivos de texto'
ls *.TXT
definir+ f

Agora corra bash fglobe_script.sh:

A parte incluída com set -f / set + f options não processou comandos com caracteres curinga.

8. Como combinar opções de depuração para depurar script de shell:

Usamos apenas uma opção nas técnicas de depuração mencionadas acima, mas podemos combinar várias opções para melhor compreensão. Vamos implementar -x e -v opções para o sum_script.sh roteiro. Estou usando o sum_script.sh roteiro.

#! / bin / bash
jogou fora 'Digite o primeiro número'
leituranúmero 1
jogou fora 'Digite o segundo número'
leituranúmero 2
soma= $[numero1 + numero2]
jogou fora 'a soma é$ soma'

Agora execute:

$bash -xvsum_script.sh

Ambos -x e -v as saídas são combinadas, conforme exibido na imagem de saída. Da mesma forma, também podemos combinar o -você opção com verbose -v para detecção de erros. Estou substituindo o número 1 variável com num na sexta linha do script:

#! / bin / bash
é$ numero2esomaé$ soma'' DEBUG
jogou fora '
Insira o primeiro número'
ler número 1
jogou fora '
Insira o segundo número'
ler o número 2
soma = $ [num + numero2]
jogou fora '
asomaé$ soma'

Para visualizar o resultado, execute o comando mencionado abaixo:

$bash -uvsum_script.sh

9. Como redirecionar o relatório de depuração para um arquivo:

Salvar um relatório de depuração de um script bash em um arquivo pode ser útil em muitas situações. É um pouco complicado porque redirecionar o relatório de depuração para um arquivo; usamos algumas variáveis ​​especiais. Vamos implementá-lo em b_script.sh código:

#! / bin / bash
exec 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
jogou fora 'Digite o número1'
leituranúmero 1
jogou fora 'Digite o número2'
leituranúmero 2
E se [ '$ numero' -gt '$ numero2' ]
então
jogou fora 'Número1 é maior que Número2'
elif [ '$ numero1' -eq '$ numero2' ]
então
jogou fora 'Número1 é igual a Número2'
outro
jogou fora 'Número2 é maior que Número1'
ser

Na segunda linha do código, pode-se ver que estamos redirecionando a saída para um debug_report.log arquivo usando o exec comando com descritor de arquivo 5 (FD5).

exec 5> debug_report.log: o exec comando está redirecionando tudo o que está acontecendo no shell para um arquivo debug_report.log.

BASH_XTRACEFD = 5: É um variável bash particular e não pode ser usado em qualquer outro shell. Ele precisa ser atribuído a um descritor de arquivo válido, e o bash gravará a saída extraída para debug_report.log.

PS4 = ’$ LINENO– ‘: Também é uma variável bash usada para imprimir o número da linha durante a depuração usando o modo xtrace. O valor padrão do PS4 é o + sinal

O script acima está gerando um arquivo de log chamado debug_report.log, para ler, use o gato comando:

Conclusão:

Um código cheio de bugs pode afetar o desempenho do programa e também ser prejudicial ao hardware. A depuração é muito importante para cada programa, pois torna o programa mais eficiente. Encontrar erros existentes e potenciais durante o desenvolvimento de um programa pode evitar que seu programa se comporte de maneira inesperada. Códigos grandes geralmente precisam de depuração ativa, aumentando a eficácia do código, eliminando o recurso que consome pedaços de código.

Muitas linguagens de programação e ambientes têm seus próprios depuradores complementares. No script bash, várias técnicas podem ser implementadas para depurar o script. Este guia enfocou completamente todos os métodos que podem ser usados ​​para encontrar bugs nos scripts bash. Portanto, sempre que você sentir que seu script bash não está se comportando conforme o esperado, use qualquer uma das técnicas mencionadas acima, mas o modo xtrace (-x) é muito útil na maioria dos casos.