Opções do Bash
Tags: bash, shellscript, portuguese, braziliandevs
Published: 2019-09-30 16:58:46

---
title: "Opções do Bash"
published: true
description: Opções avançadas do Bash.
tags:
  - bash
  - shellscript
  - portuguese
  - braziliandevs 
---

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](http://www.tldp.org/LDP/abs/html/options.html)

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:

```bash
#!/bin/bash
set -v 
...
```

```bash
...
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:

```bash
...
set +o verbose
```

```bash
...
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`

```bash
#! /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.

```bash
#!/bin/bash
set -e
cat logs.txt
mkdir p
file p   
```
```bash
$ ./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`

```bash
#!/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á:

```bash
./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`


```bash
./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`

```bash
#!/bin/bash
set  -e

echo "world"
echo "$a"
echo "hello" 
```
Saída:

```bash
./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.

```bash 

/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`

```bash
#!/bin/bash
set  -e 
bar | echo "O mundo é um redemoinho"
echo "world"
echo "hello" 
```

Saída:

```bash
./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

```bash
#!/bin/bash
set  -eo pipefail
bar | echo "O mundo é um redemoinho"
echo "world"
echo "hello" 
```

Saída:

```bash

./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.