Como depurar um Shell script no Linux ou UNIX

A pergunta mais comum feita por novos usuários do sysadmins ou Linux/UNIX. A depuração de scripts do shell pode ser um trabalho tedioso. Existem várias maneiras de depurar um script de shell.

Uma delas você precisa passar o argumento -xou -v para bash shell para percorrer cada linha do script. Vamos ver como depurar um script bash em execução no Linux e Unix usando vários métodos.

-x opção para depurar um script shell bash

Execute um script de shell com a opção -x.

$ bash -x script-name
$ bash -x domains.sh

Uso do comando set builtin

O Bash shell oferece opções de depuração que podem ser ativadas ou desativadas usando o comando set :

  • set -x : Exibe comandos e seus argumentos à medida que são executados.
  • set -v : Exibe as linhas de entrada do shell conforme são lidas.

Você pode usar acima de dois comandos no próprio script de shell:

#!/bin/bash
clear

# ativa o modo de depuração
set -x
for f in *
do
   file $f
done
# desativa o modo de depuração
set +x
ls
# mais comandos

Você pode substituir a linha Shebang padrão :

#!/bin/bash

pelo código a seguir (para depuração):

#!/bin/bash -xv

Uso da função DEBUG inteligenteUso da função DEBUG inteligente

Primeiro, adicione uma variável especial chamada _DEBUG. Defina _DEBUG como 'on' quando precisar depurar um script:

_DEBUG="on"

Coloque a seguinte função no início do script:

function DEBUG()
{
 [ "$_DEBUG" == "on" ] &&  [email protected]
}

Agora, sempre que você precisar depurar, use a função DEBUG da seguinte maneira:

DEBUG echo "File is $filename"

OU

DEBUG set -x
Cmd1
Cmd2
DEBUG set +x

Quando terminar a depuração (e antes de mover o script para produção), defina _DEBUG como 'off'. Não há necessidade de excluir linhas de depuração.

_DEBUG="off" # set to anything but not to 'on'

Exemplo de script:

#!/bin/bash
_DEBUG="on"
function DEBUG()
{
 [ "$_DEBUG" == "on" ] &&  [email protected]
}

DEBUG echo 'Leitura de arquivo'
for i in *
do
  grep 'something' $i > /dev/null
  [ $? -eq 0 ] && echo "Encontrado no arquivo $i"
done
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x
echo "$a + $b = $c"

Salve e feche o arquivo. Execute o script da seguinte maneira:

./script.sh

Saída:

Lendo arquivos 
Encontrados no arquivo xyz.txt 
+ a = 2 
+ b = 3 
+ c = 5 
+ DEBUG definido + x 
+ '[' on == on ']' 
+ definido + x 
2 + 3 = 5

Agora defina DEBUG como desativado (você precisa editar o arquivo):

_DEBUG="off"

Executar script:

./script.sh

Saída:

Encontrado no arquivo xyz.txt 
2 + 3 = 5

Acima é uma técnica simples, mas bastante eficaz. Você também pode tentar usar DEBUG como um alias em vez de uma função.

Depurando erros comuns de script do shell bashDepurando erros comuns de script do shell bash

Bash ou sh ou ksh fornece várias mensagens de erro na tela e, em muitos casos, a mensagem de erro pode não fornecer informações detalhadas.

Ignorando para aplicar a permissão de execução no arquivo

Ao escrever seu primeiro script do hello world bash shell , você pode acabar recebendo um erro da seguinte maneira:

./hello.sh: Permission denied

Defina a permissão usando o comando chmod:

chmod +x hello.sh
./hello.sh

Erro inesperado no final do arquivo

Se você receber uma mensagem de erro inesperada no final do arquivo, abra o arquivo de script e verifique se há aspas de abertura e fechamento. Neste exemplo, a instrução echo possui uma citação de abertura, mas nenhuma citação de fechamento:

#!/bin/bash
...
....
echo 'Error: arquivo não encontrado
                                        ^^^^^^^
                                        cotação ausente

Verifique também se há parênteses e chaves ausentes ({}):

#!/bin/bash
.....
[ ! -d $DIRNAME ] && { echo "Error: Dir chroot não encontrado"; exit 1;
                                                                    ^^^^^^^^^^^^^
                                                                    chave faltando }
...

Palavras-chave ausentes, como fi, esac, ;; etc.Palavras-chave ausentes, como fi, esac, ;; etc.

Se você perdeu a palavra-chave final, como fi ou ;; você receberá um erro como "xxx inesperado". Portanto, verifique se todas as instruções if e case aninhadas terminam com palavras-chave adequadas. Consulte a página de manual do bash para obter os requisitos de sintaxe. Neste exemplo, está faltando fi:

#!/bin/bash
echo "Starting..."
....
if [ $1 -eq 10 ]
then
   if [ $2 -eq 100 ]
   then
      echo "Do something"
fi

for f in $files
do
  echo $f
done

# note fi is missing

Movendo ou editando o shell script nas caixas do Windows ou Unix

Não crie o script no Linux e vá para o Windows. Outro problema é editar o script do shell bash no Windows 10 e fazer o upload para o servidor Linux. Isso resultará em um erro como o comando não encontrado devido ao retorno de carro (DOS CR-LF). Você pode converter as novas linhas do DOS CR-LF para o formato Linux usando a seguinte sintaxe:

dos2unix my-script.sh

Dica 1 - Enviar mensagem de depuração para stderr

Erro padrão é o dispositivo de saída de erro padrão, usado para gravar todas as mensagens de erro do sistema. Portanto, é uma boa ideia enviar mensagens para o dispositivo de erro padrão:

# Write error to stdout
echo "Error: $1 file not found"
#
# Write error to stderr (note 1>&2 at the end of echo command)
#
echo "Error: $1 file not found" 1>&2

Dica 2 - Ative o Realce de sintaxe ao usar o editor de texto vim

A maioria dos editores de texto modernos permite definir a opção de destaque de sintaxe. Isso é útil para detectar sintaxe e evitar erros comuns, como abertura ou fechamento de cotação. Você pode ver o script bash em cores diferentes. Esse recurso facilita a escrita em estruturas de script de shell e os erros de sintaxe são visualmente distintos. O destaque não afeta o significado do próprio texto; é feito apenas para você.

Dica 3 - Use o shellcheck para lint script

ShellCheck é uma ferramenta de análise estática para scripts de shell . Pode-se usá-lo para encontrar erros em seus scripts de shell. Está escrito em Haskell. Você pode encontrar avisos e sugestões para scripts de shell bash/sh com esta ferramenta.

Deixe uma resposta
You May Also Like