Existe alguma maneira de depurar o script bash sem usar eco e log?
Estou falando sobre o uso de pontos de interrupção e coisas assim.
Sim, existe o Bash Debugger Project .
Você também pode usar set -x
e set -v
na execução. Mais informações:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html
Boa sorte!
Existem várias maneiras diferentes, ou seja:
Execute seu script com a opção -x
bash -x yourscript.sh
Adicione set -x
uma nova linha no início do seu arquivo #!/bin/bash
de script após o Shebang e antes do início do seu script, set -v
exibirá as linhas de entrada do shell, set -x
exibirá os comandos e argumentos executados
substitua o shebang do seu arquivo de script por #!/bin/bash -xv
Atualmente, há a extensão de depuração do Visual Studio Code Bash . Possui 'Entrada / saída / saída' e pode mostrar o valor de cada variável.
o cheque é o melhor da cidade -
você também pode integrar com o vim, aqui está o repositório git -
Você pode usar esta pequena função para entrar no "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 |####################";
}
Em seguida, 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 aceitará qualquer comando, mantendo intactas as variáveis locais. Para sair do modo "debug", digite "exit" (não sairá do script) e continuará com o código. Se você usar "debug" dentro de um loop, ele será interrompido a cada vez. Você pode colocá-lo dentro de um "se" (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"
Eu também adicionei o comando "vars", que despejará todas as variáveis disponíveis e seus valores. Você também pode adicionar seus próprios comandos personalizados.
Fiz o código em alguns minutos, portanto, use-o por sua conta e risco. Esteja ciente de que, no modo de depuração, qualquer comando pode ser executado; portanto, isso representa um risco de segurança se você o deixar em um script de produção.
* ) eval "$cmd" ;;
edebug_watch "$file" strange_case.txt
.Para o que o NES está dizendo, há sinalizadores definidos no bash para permitir a depuração.
O
set -x
sinalizador pode ser definido e desabilitado no terminal ou dentro do seu script. Usando+
ou-
:Aqui está o que os
set
comandos fazem:set -f
Desative a geração de nome de arquivo usando metacaracteres.set -v
Imprime linhas de entrada do shell (detalhadas) à medida que são lidas.set -x
Imprima rastreamentos de comandos antes de executar o comando.set
na verdade, possui muitos recursos, mas lamentavelmente nenhuma página de manual, pois é um shell integrado à ferramenta. O manual para set está na documentação do GNU Bash .Existem inúmeras ferramentas de linha de comando que podem ajudá-lo a obter detalhes sobre o seu programa, como:
stat
exibir arquivo ou status do sistema de arquivosfile
determine um tipo de arquivo.hexdump
filtro que exibe os arquivos especificados em vários formatosnohup
Execute um script que não travaráe muitos outros. Eu estava tentando pensar no comando que mostra caracteres ocultos, mas não posso fazê-lo agora. O Hexdump fará isso, mas há um melhor.
O comando key ctrl\fará com que um programa ou script em execução seja executado no core dump. Então você pode analisar o coredump. Eu provavelmente usaria o gdb para analisar um coredump, mas existem muitos programas para isso.
O shell bash também possui algumas opções bacanas para depuração. opções
--debugger
,-v
detalhado--dump-strings
e outras opções bacanas para ajudá-lo. Vê-los usandoman bash
.O
trap
comando (shell incorporado) pode ser muito útil para você. trap diz que se o seu programa sair inesperadamente, execute algo. Você leu sobre armadilhas e outros práticos recursos do Bash Shell aqui .Falando de um modo geral 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.
Finalmente, percebo que o exemplo que usei é trivial, mas que 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 divisão e conquista.
fonte
Uma opção da GUI para depurar um script bash é o IDE Eclipse com os plug-ins BashEclipse / Shelled.
Isso fornece os recursos da sua pergunta (
breakpoints and stuff
), além de vários outros recursos para depurar scripts bash complexos.Alguns dos recursos incluem:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )
A perspectiva do Editor de scripts:
A perspectiva de depuração:
As etapas para o uso são adicionar os plugins
Shelled
eBashEclipse
ao eclipse. Em seguida, execute o procedimento fornecido no arquivo de texto leia-me do BashEclipse para iniciar o depurador.fonte