você está aqui: Home  → Arquivo de Mensagens

Uma pequena dica de uso do shopt

Colaboração: Julio Cezar Neves

Data de Publicação: 27 de fevereiro de 2021

Mostrarei neste artigo algumas dicas de uso do intrínseco (builtin) shopt do Bash. O assunto não se esgota aqui pois neste artigo veremos somente algumas dicas (cerca de 20%) de uso da opção -s, (de set) mas estava no site do Bash, baixando a versão 4.0 quando me deparei com estes macetes e trouxe-os para dividir com vocês.

Teste as opcoes a seguir dentro do comando shopt -s <opcoes>.

cdspell

Com esta opção setada, pequenos erros de digitação no nome do diretório para o qual você deseja fazer um cd serão ignorados, isto é, caracteres extras ou esquecidos serão automaticamente corrigidos sem necessidade de redigitação.

No exemplo a seguir, queria fazer um cd rede, que é um diretório abaixo do meu home.

$ cd red
bash: cd: red: Arquivo ou diretório inexistente

$ shopt -s cdspell
$ cd red
rede

$ cd -
/home/jneves

$ cd ede
rede

$ cd -
/home/jneves

$ cd redes
rede
cmdhist

Essa opção é bacana, pois transforma comandos criados em diversas linhas (como um for ou um while, por exemplo) em uma única linha, com os comandos separados por ponto-e-vírgula (;). Isso é particularmente útil para editar comandos e portanto é uma opção setada por default pelo Bash.

dotglob

Esta opção permite que

This one allows files beginning with a dot ('.') to be returned in the results of path-name expansion.

$ ls *bash*
ls: impossível acessar *bash*: Arquivo ou diretório inexistente

$ shopt -s dotglob
$ ls *bash*
.bash_history  .bash_logout  .bashrc

extglob

O Shell possui, alem do globbing normal (a expansão *, ? e [a-z] de nomes de arquivos e diretórios), um globbing extendido.

Acho que, em alguns casos, poderá ser bem útil, eliminando um pipe para um grep por exemplo.

São eles:

?(padrao) Casa zero ou uma ocorrência de um determinado padrao.
*(padrao) Casa zero ou mais ocorrências de um determinado padrao.
+(padrao) Casa uma ou mais ocorrências de um determinado padrao.
@(padrao) Casa com exatamente uma ocorrência de um determinado padrao.
!(padrao) Casa com qualquer coisa, exceto com padrao.

Para poder utilizá-lo precisamos executar o shopt antes. Repare que uma barra vertical (|) dentro dos parênteses equivale a um "ou" lógico. Veja os exemplos a seguir:

$ shopt -s extglob
$ ls
file filename filenamename fileutils 
$ ls file?(name)
file filename
$ ls file*(name)
file filename filenamename
$ ls file+(name)
filename filenamename
$ ls file@(name)
filename
$ ls file!(name)          # divertido esse
file filenamename fileutils
$ ls file+(name|utils)
filename filenamename fileutils
$ ls file@(name|utils)    # "lembra" um {name,utils}
filename fileutils

As principais opções do comando shopt são:

Opção Significado
-s Habilita (set) a opção
-u Desabilita (unset) a opção
-q Suprime a saída (quiet). Ótima para saber pelo código de retorno ($?) se uma opção está setada ou não


Veja a relação completa dos artigos de Julio Cezar Neves