Respostas:
Inicie seu script bash com bash -x ./script.sh
ou adicione seu script set -x
para ver a saída de depuração.
Adicional com bash
4.1 ou posterior:
Se você deseja gravar a saída de depuração em um arquivo separado, adicione isso ao seu script:
exec 5> debug_output.txt
BASH_XTRACEFD="5"
Consulte: https://stackoverflow.com/a/25593226/3776858
Se você quiser ver os números das linhas, adicione isto:
PS4='$LINENO: '
logger
comando, poderá usá-lo para gravar a saída de depuração via syslog com carimbo de data / hora, nome do script e número da linha:
#!/bin/bash
exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x
# Place your code here
Você pode usar a opção -p
de logger
comando para definir um recurso e um nível individuais para gravar a saída via syslog local em seu próprio arquivo de log.
BASH_XTRACEFD="5"
bash, grava a saída de rastreamento gerada quando set -x
ativada no descritor de arquivo 5. exec 5> >(logger -t $0)
redireciona a saída do descritor de arquivo 5 para o logger
comando.
set -x
Eu sempre uso set -x
e set +x
. Você pode agrupar áreas nas quais deseja ver o que está acontecendo com elas para ativar / desativar a verbosidade.
#!/bin/bash
set -x
..code to debug...
set +x
Além disso, se você fez um trabalho de desenvolvimento e está familiarizado com o estilo dos registradores que usam os nomes log4j, log4perl etc., convém usar o log4bash .
excertoVamos ser sinceros - o eco simples e antigo simplesmente não é suficiente. log4bash é uma tentativa de ter um melhor registro para scripts do Bash (ou seja, tornar o log no Bash menos trabalhoso).
A partir daí, você pode fazer coisas assim nos seus scripts do Bash:
#!/usr/bin/env bash
source log4bash.sh
log "This is regular log message... log and log_info do the same thing";
log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";
# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";
# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";
Resultando neste tipo de saída:
Se você precisar de algo mais portátil, também há os mais antigos log4sh
. Trabalhos similares a log4bash
, disponíveis aqui:
alias say="spd-say"
no meu .bashrc, que imita o say
comando de outras distros ou OS X.
Há um depurador bash, o bashdb , que é um pacote instalável em muitas distribuições. Ele usa o modo de depuração estendido interno do bash ( shopt -s extdebug
). Parece muito com gdb; aqui está uma sessão de amostra para dar um sabor:
$ ls
1st.JPG 2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
newf=${f/JPG/jpg}
mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1: for f in *.JPG
bashdb<0> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4: mv $f $newf
Como no gdb, a instrução é mostrada imediatamente antes de ser executada. Portanto, podemos examinar variáveis para ver o que a declaração fará antes de fazê-lo.
bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1: for f in *.JPG
bashdb<4> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4: mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG
Não é isso que queremos! Vejamos a expansão de parâmetros novamente.
bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg
OK, isso funciona. Vamos definir newf
o valor correto.
bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg
Parece bom. Continue o script.
bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg 2ndJPG.jpg
O método padrão para depurar scripts na maioria dos shells baseados em Bourne, como o bash, é escrever set -x
na parte superior do seu script. Isso tornará o bash mais detalhado sobre o que está sendo feito / executado e como os argumentos são avaliados.
-x Print commands and their arguments as they are executed.
isso é útil para o intérprete ou para scripts internos. Por exemplo:
$ find "$fileloc" -type f -prune "$filename" -print
+ find /var/adm/logs/morelogs -type f -prune '-name *.user' -print
find: unknown predicate '-name *.user'
$ find "$fileloc" -type f -prune $filename -print
+ find /var/adm/logs/morelogs -type f -prune -name '*.user' -print
find: '/var/adm/logs/morelogs': No such file or directory
No exemplo acima, podemos ver por que a localização está falhando devido a aspas simples.
Para desativar o recurso, basta digitar set +x
.
Você pode usar o ambiente combinado do Eclipse e Shelled com o script "_DEBUG.sh" vinculado abaixo.
Por padrão, a ferramenta de desenvolvimento Shelled usa /bin/dash
como intérprete. Alterei isso para /bin/bash
ter uma melhor compatibilidade com a maioria dos exemplos de shell na Web e no meu ambiente.
NOTA: Você pode alterar isso acessando: Janela -> Preferências -> Shell Script -> Intérpretes
O pacote Debugger possui as etapas para usar o _DEBUG.sh
script para sua depuração de script, que é basicamente (o readme.txt):
- Criar projeto de shell script: Arquivo -> Novo -> Outro -> Shell Script -> Assistente de projeto de script de shell .
- Crie um arquivo de script Bash: Arquivo -> Novo -> Arquivo . Para este exemplo, será
script.sh
. A extensão deve ser ".sh" e é uma obrigação.- Copie o arquivo
_DEBUG.sh
para a pasta do projeto.Insira o seguinte texto na parte superior do arquivo
script.sh
:. _DEBUG.sh
Se o arquivo for criado no Microsoft Windows, execute o Arquivo -> Converter delimitadores de linha em -> Unix .
Defina uma configuração de inicialização de depuração: Execute -> Configurações de Depuração -> Script Bash ... Existem 2 campos para definir aqui:
a) "Script Bash:" - Caminho na área de trabalho do Eclipse para o script Bash para depuração.
e) "Porta do depurador:" 33333Alterne para a perspectiva Debug. Inicie a sessão de depuração. Iniciar a
script.sh
partir do shell bash.
Este depurador do bash possui todos os recursos dos depuradores de programação padrão, como:
O IDE Shelled (Shell Script Editor) (Ambiente de desenvolvimento integrado) possui um bônus adicional de executar verificação de contexto, realçar e recuar enquanto escreve seu script. Se não recuar corretamente, você poderá imediatamente sinalizar / muitos erros locais lá.
Existem outros benefícios do IDE , como:
Um recurso maravilhoso apareceu nos últimos anos: http://shellcheck.net
mostra mais do que o bash normal, permitindo encontrar facilmente aquelas citações não fechadas ou suportes encaracolados, etc.
Apenas certifique-se de não colar informações confidenciais (ips, senhas etc.) na rede ... (especialmente por ser http, sem criptografia) (acredito que o shellcheck também esteja disponível para download, mas não tenho certeza)
Atualmente, existe o VS Code Bash Debug.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Possui 'Step in / out / over' e também mostra o valor de cada variável.