How to debug shell script in linux?

4

I'm new to linux, and I'm learning shell script and my question is as follows.

When I want to debug something in PHP, for example, I put a breakpoint in the code and run the same with debug on, I wanted to know how can I do this with a shell script? Would I have to debug by passing line by line of my code? Thank you.

    
asked by anonymous 28.02.2017 / 03:52

2 answers

3

To debug Bash-Script there are some very useful tools:

Parameter -n not bash

Using the bash -n command parses your script to check for typos or to prevent your script from running.

File: exampleBashN.sh

#!/bin/bash

echo "Isso é um exemplo"
echo "Agora falta uma aspas
echo "E o bash -n deve notificar esse problema"

Execution:

$bash -n exemploBashN.sh
exemploBashN.sh: line 5: unexpected EOF while looking for matching '"'
exemploBashN.sh: line 7: syntax error: unexpected end of file
$

Command set

The set command enables and disables some features of bash . When used with - , it enables functionality. When using with + it turns off the same.

set -x

Enables the EXPRESSION print run.

File: exampleBashSetX.sh

#!/bin/bash

set -x
echo "Quantos anos você tem?"
read idade
echo "Você tem $idade anos"
set +x
echo "Agora sem imprimir a expressão executada"

Execution:

$./exemploSetX.sh
+ echo 'Quantos anos você tem?'
Quantos anos você tem?
+ read idade
26
+ echo 'Você tem 26 anos'
Você tem 26 anos
+ set +x
Agora sem imprimir a expressão executada
$

set -v

Enables printing of LINE executed

File: sampleSetV.sh

#!/bin/bash

set -v
echo "Quantos anos você tem?"
read idade
echo "Você tem $idade anos"
set +x
echo "Agora sem imprimir a LINHA executada"

Execution:

$./exemploSetV.sh
echo "Quantos anos você tem?"
Quantos anos você tem?
read idade
26
echo "Você tem $idade anos"
Você tem 26 anos
set +v
Agora sem imprimir a LINHA executada
$

set -e

It aborts script execution when any command fails.

File: sampleSetE.sh

#!/bin/bash

set -e

echo "Carregando www.goooooooogle.com.br (site não existe)"

curl -v -f "www.goooooooogle.com.br" > site.html

echo "Essas linha não serão executadas"
echo "pois o comando 'curl' não conseguiu executar com sucesso"   

set +e

echo "Nem essas, pois o script já foi abortado."

Execution:

./exemploSetE.sh
Carregando www.goooooooogle.com.br (site não existe)
* Rebuilt URL to: www.goooooooogle.com.br/
* Could not resolve host: www.goooooooogle.com.br
* Closing connection 0
curl: (6) Could not resolve host: www.goooooooogle.com.br

Command trap

The trap command can be used together with read to simulate the use of breakpoints.

#!/bin/bash

echo "após o comando \"trap 'read' DEBUG\", aperte ENTER para executar o proximo comando"

trap 'read' DEBUG 

echo "olá"
echo "mundo"
echo "bash"
echo "é só love"

trap - DEBUG 

echo "agora"
echo "sem"
echo "debug"

$ Execution:

$./exemploTrap.sh 
após o comando "trap 'read' DEBUG", aperte ENTER para executar o proximo comando
<ENTER>
olá
<ENTER>
mundo
<ENTER>
bash
<ENTER>
é só love
<ENTER>
agora
sem
debug
$

Source

13.05.2017 / 03:18
4

You can debug bash by running the script with the -x parameter:

bash -x nome_do_seu_script.sh

If you just want to debug part of the code, you can end it with set :

set -x
<código>
set +x
    
01.03.2017 / 12:19