Logo

dev-resources.site

for different kinds of informations.

Opções do Bash

Published at
9/30/2019
Categories
bash
shellscript
portuguese
braziliandevs
Author
renatoassis01
Author
13 person written this
renatoassis01
open
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.

portuguese Article's
28 articles in total
Favicon
Fundamentos da Segurança em Aplicações Web
Favicon
🇫🇷🇪🇸🇩🇪🇮🇹🇯🇵 What if we made DEV.to polyglot ?
Favicon
Usando o shepherdjs para fazer tours em uma aplicação nuxt (vue.js) (Parte 2)
Favicon
Usando o shepherdjs para fazer tours em uma aplicação nuxt (vue.js) (Parte 1)
Favicon
Criando um ambiente de desenvolvimento com Nix
Favicon
Usando constant e immutable para reduzir o custo de gás
Favicon
Introdução ao SEO
Favicon
Certificações AWS — Por quê e de que forma
Favicon
Ainda dá tempo de ser DEV?
Favicon
Como deixar os testes Jest mais rápidos?
Favicon
TCP Handshakes 101: o básico pra iniciar no assunto
Favicon
Introdução ao Bean Validation: Deixe o Java Trabalhar!
Favicon
TypeScript vs Dart - Coleções iteráveis
Favicon
Rust e eu – como tem sido a experiência e minha bibliografia comentada!
Favicon
O front-end além da web
Favicon
GitHub Alias FTW!
Favicon
Seu Commit + Rápido
Favicon
Iniciando com Github Desktop no Windows e MacOS
Favicon
Angular Reactive Forms Custom Validators[Português]
Favicon
/dev/All – uma comunidade de pessoas que amam programar
Favicon
Como eu gerencio o meu tempo.
Favicon
Uber Movement: antes e depois do COVID-19
Favicon
Por que você deveria dar uma chance ao Tailwind CSS
Favicon
5 Dicas para você saber no Javascript
Favicon
Como se constrói um sistema corporativo?
Favicon
Opções do Bash
Favicon
Depois do Café - Episodio 6 - Corona Edition - O que fazer no tempo livre?
Favicon
Episódio 5 - Corona Edition: Trabalhando de Casa

Featured ones: