DEV Community

Renato Assis
Renato Assis

Posted on • Updated on

Opções do Bash

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ção v é que na opção x é 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ção set -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.

Discussion (0)