Escrever shell script para realizar tarefas rotineiras de desenvolvimento pode ser muito útil, porém as vezes nos deparamos com alguns comportamentos inesperados do bash. Neste artigo você aprenderá algumas opções que alteram o comportamento do shell e ou do script e evitam efeitos indesejáveis e que são muito úteis. Use com moderação!
Aqui vai algumas dessas opções:
Abreviação | Nome | Efeito |
---|---|---|
-e | errexit | Abortar script no primeiro erro, quando um comando sair com status diferente de zero (exceto em for ou while loops, if-tests, list constructs ) |
-x | xtrace | Semelhante a -v, mas expande os comandos |
-v | verbose | Imprima cada comando para stdout antes de executá-lo |
-u | nounset | Verifica variáveis indefinidas e força a saída |
-o pipefail | -o pipefail | Faz com que um pipeline retorne o status de saída do último comando que retornou um valor de retorno diferente de zero. |
Para mais detalhes consulte Tabela 33-1. Opções do bash
Para usar essas opções dentro do script, use o comando set
nas seguintes formas: set -o nome-da-opção ou, na forma abreviada, set -opção-abrev. Essas duas maneiras são equivalentes.
Exemplos:
#!/bin/bash
set -v
...
...
set -o verbose
...
Para desabilitar uma opção dentro de um script, use set +o nome-da-opção ou set +opção-abrev .
Exemplos:
...
set +o verbose
...
set +v
...
opção -e(errexit)
Essa opção encerra a execução do script no primeiro erro encontrado.
Considere o conteúdo do arquivo script.sh
#! /bin/bash
cat logs.txt
mkdir p
file p
Ao executar o script note que o arquivo logs.txt
não existe, porém mkdir é executado
$ ./script.sh
cat: logs.txt: No such file or directory
p: directory
Adicionando a opção set -e
no arquivo script.sh
garantirá que ao primeiro erro a execução seja abortada.
#!/bin/bash
set -e
cat logs.txt
mkdir p
file p
$ ./script.sh
cat: logs.txt: No such file or directory
Observe que o comando mkdir não é processado
opção -x(xtrace)
Considerando o arquivo script.sh
#!/bin/bash
set -x
for x in 1 2 3 4 5
do
echo "$x"
done
echo 'olá'
mkdir -p g
Sua saída será:
./script.sh
+ for x in 1 2 3 4 5
+ echo 1
1
+ for x in 1 2 3 4 5
+ echo 2
2
+ for x in 1 2 3 4 5
+ echo 3
3
+ for x in 1 2 3 4 5
+ echo 4
4
+ for x in 1 2 3 4 5
+ echo 5
5
+ echo olá
olá
+ mkdir -p g
opção -v(verbose)
Em comparação com flag set -v
./script.sh
for x in 1 2 3 4 5
do
echo "$x"
done
1
2
3
4
5
echo 'olá'
olá
mkdir -p g
A diferença de
x
para a opçãov
é que na opçãox
é mostrada a execução passo à passo
opção -u(nounset)
Considerando o arquivo script.sh
#!/bin/bash
set -e
echo "world"
echo "$a"
echo "hello"
Saída:
./script.sh
world
hello
Note que variável
$a
não existe, mas o script foi executado mesmo com a opçãoset -e
habilitada.
Com a opção set -eu
o comportamento é totalmente diferente.
/script.sh
world
./script.sh: line 5: a: unbound variable
O bash não executará, pois com a opção -u
habilitada ele verifica se todas as variáveis tem algum valor atribuído.
opção -o(pipefail)
Normalmente, o bash apenas consulta o último código de saída de um comando no pipeline de execução. Esse comportamento não é ideal, pois faz com que a opção -e
só considere a saída do último comando executado.É aqui que o -o pipefail
entra. Essa opção define que o bash verifique o código de saída do comando mais à direita.
Confuso?
Vamos novamente com o script script.sh
#!/bin/bash
set -e
bar | echo "O mundo é um redemoinho"
echo "world"
echo "hello"
Saída:
./script.sh
./script.sh: line 3: bar: command not found
O mundo é um redemoinho
world
hello
As seguinte linhas foram executadas mesmo com a opção
set -e
definida.
Isso acontece porque a opção set -e
só verifica o último status, no caso echo "O mundo é um redemoinho"
e como ele foi executado corretamente.
Para alterar esse comportamento é só definir set -o pipefail
Veja que a sintaxe dessa opção deve ser seguida da opção -o
#!/bin/bash
set -eo pipefail
bar | echo "O mundo é um redemoinho"
echo "world"
echo "hello"
Saída:
./script.sh: line 3: bar: command not found
Use sempre set -o pipefail
em conjunto com as outras opções.
Habilitando essas opções em seus scripts, você vai evitar muitos comportamentos inesperados, lembre-se seja cauteloso com o uso dessas opções.
Top comments (0)