Como Depurar um Script Bash Shell Sob Linux ou UNIX
Da minha mala de correio:
Eu escrevi um pequeno script mundial de olá. Como posso depurar um script bash shell rodando em um sistema Linux ou Unix?
É a pergunta mais comum feita por novos usuários sysadmins ou Linux/UNIX. A depuração de shell scripts pode ser um trabalho tedioso (lido como não fácil). Existem várias maneiras de depurar um script shell.
Precisa de passar o argumento -x ou -v para fazer bash shell para percorrer cada linha do script.
Deixe-nos ver como depurar um script bash rodando no Linux e Unix usando vários métodos.
-x opção para depurar um script bash shell
Executar um script shell com -x option.$ bash -x script-name
$ bash -x domains.sh
Uso do comando set builtin
Bash shell oferece opções de depuração que podem ser ligadas ou desligadas usando o comando set:
- set -x : Exibir comandos e seus argumentos à medida que são executados.
- set -v : Exibe linhas de entrada da shell à medida que são lidas.
Você pode usar acima de dois comandos no próprio script da shell:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
>
>
>
>
>
>
>
Você pode substituir a linha Shebang padrão:#!/bin/bash
com o seguinte código (para depuração):#!/bin/bash -xv
Uso da função DEBUG inteligente
Primeiro, adicione uma variável especial chamada _DEBUG. Defina _DEBUG para ‘on’ quando precisar de depurar um script:_DEBUG="on"
Põe a seguinte função no início do script:
function DEBUG(){ && $@}
>
>
>>
Agora onde precisar de depurar simplesmente use a função DEBUG como se segue:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Quando terminar a depuração (e antes de mover o seu script para a produção) defina _DEBUG para ‘off’. Não há necessidade de apagar linhas de depuração._DEBUG="off" # set to anything but not to 'on'
Sample script:
#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"
>
>
Salve e feche o arquivo. Execute o script da seguinte forma:$ ./script.sh
Escript:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Agora defina DEBUG para off (você precisa editar o arquivo):_DEBUG="off"
Executar script:$ ./script.sh
Escript:
Found in xyz.txt file2 + 3 = 5
Acima é uma técnica simples mas bastante eficaz. Você também pode tentar usar DEBUG como um alias em vez de função.
Debugging Common Bash Scripting Errors
Bash ou sh ou ksh dá várias mensagens de erro na tela e em muitos casos a mensagem de erro pode não fornecer informações detalhadas.
Skipping para aplicar permissão de execução no ficheiro
Quando escreve o seu primeiro script bash world bash, pode acabar por receber um erro que diz o seguinte:bash: ./hello.sh: Permission denied
Definir permissão usando o comando chmod:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
End of file unexpected Error
Se estiver a receber uma mensagem de erro de End of file unexpected, abra o seu ficheiro de script e certifique-se que tem tanto as aspas de abertura como de fecho. Neste exemplo, a declaração de eco tem uma citação de abertura mas sem citação de fecho:
>
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
>
>
>
>
>
>
>
Até também certifique-se de verificar se faltam parênteses e chaves ({}):
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
>
>
>
Palavras-chave em falta, tais como fi, esac, ;;;, etc.
Se falhou palavras-chave finais como fi ou ;; receberá um erro como “xxx inesperado”. Portanto, certifique-se de que todas as declarações aninhadas se e casos terminam com palavras-chave adequadas. Veja bash man page para requisitos de sintaxe. Neste exemplo, falta fi:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
>
>
>
Movendo ou editando o script da shell no Windows ou Unix boxes
Não crie o script no Linux/Unix e mude para o Windows. Outro problema é editar o bash shell script no Windows 10 e mover/upload para o servidor Unix. Ele resultará em um erro como o comando não encontrado devido ao retorno de carruagem (DOS CR-LF). Você pode converter novas linhas DOS CR-LF para o formato Unix/Linux usando a seguinte sintaxe:dos2unix my-script.sh
Tip 1 – Send Debug Message To stderr
Standard error is the default error output device, which is used to write all system error messages. Portanto, é uma boa idéia enviar mensagens para o dispositivo de erro padrão:
# Write error to stdoutecho "Error: file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error: file not found" 1>&2
>
Dica 2 – Destaque de Sintaxe ao usar o editor de texto vim
Os editores de texto mais modernos permitem que você defina a opção de destaque de sintaxe. Isto é útil para detectar a sintaxe e prevenir erros comuns, como abrir ou fechar aspas. Você pode ver o script bash em cores diferentes. Esta funcionalidade facilita a escrita em estruturas de shell script e os erros de sintaxe são visualmente distintos. O realce não afecta o significado do texto em si; ele é feito apenas para si. Neste exemplo, o destaque da sintaxe do vim é usado para o meu script bash:
Fig.01: destaque da sintaxe do script shell usando o editor de texto do vim
Tip 3 – Use shellcheck para lint script
ShellCheck é uma ferramenta de análise estática para scripts shell. Pode-se usá-la para encontrar bugs em seus scripts shell. Ele é escrito em Haskell. Você pode encontrar avisos e sugestões para bash/sh shell scripts com esta ferramenta. Vamos ver como instalar e usar o ShellCheck em um sistema Linux ou tipo Unix para melhorar seus scripts shell, evitar erros e produtividade.
Veja também:
- Veja como ativar o destaque de sintaxe no editor de texto vim.
- Bash man page
- BASH with Debugger and Improved Debug Support and Error Handling
>
🐧 24 comentários até agora… adicionar um ↓
Categoria | Lista de comandos Unix e Linux |
---|---|
Arquivo Gestão | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Utilitários de rede | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 |
Package Manager | apk – apt |
Process Management | bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – tempo |
Procura | grep – whereis – que |
Informação do utilizador | grupos – id – lastcomm – último – tampa/libuser-lid – logname – membros – usuários – whoami – quem – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |