Arquivo

Posts Tagged ‘dica’

Auto-completando opções de comandos com o bash completion


Um recurso que achei muito bom no Ubuntu  e me dei conta que não tinha no fedora é o de auto-completar opções de vários comandos no terminal apenas como a tecla TAB. Já é sabido que o bash é capaz de completar o nome de um de um comando, um arquivo ou um caminho através dessa tecla, mas o que muitos não sabem é que também é possível completar as opções dos comandos passados ou até mesmo o nome de um pacote que você quer remover ou instalar do seu sistema. Vejamos um exemplo (o caractere ‘|’ representa a posição do cursor, abaixo):

# yum l|[TAB]
list          localinstall

Note que eu me referi a uma opção que começa com ‘l’ do comando yum e teclei TAB (duas vezes na primeira vez) e como retorno, o shell me mostrou as duas opções possíveis para o comando yum que começam com a letra ‘l’: list e localinstall. Nesse caso, se eu colocar mais uma letra e dar um TAB, a opção já fica automaticamente definida.  Assim, se fizer:

# yum lo|[TAB]

o shell irá expandir para

# yum localinstall |

Vejamos mais dois exemplos. Um ainda com o yum e outro com o comando update-alternatives:

# yum ins|[TAB]

Expande para

# yum install |

E depois tento instalar um programa que começa com ea:

# yum install ea|[TAB]
earcandy.noarch                           easymock2-javadoc.noarch
earth-and-moon-backgrounds-common.noarch  easymock2.noarch
earth-and-moon-backgrounds-dual.noarch    easymock-javadoc.noarch
earth-and-moon-backgrounds-kdm.noarch     easymock.noarch
earth-and-moon-backgrounds.noarch         easystroke.x86_64
earth-and-moon-backgrounds-single.noarch  easytag.x86_64

isto é, uma lista de todos os programas que posso instalar no meu sistema. Agora veja:

# yum install easyt|[TAB]

e então..

# yum install easytag |

Agora com o update-alternatives:

# update-alternatives --|[TAB]
--admindir  --auto      --display   --install   --remove    --verbose
--altdir    --config    --help      --quiet     --set       --version
# update-alternatives --c|[TAB]

E será expandido para:

# update-alternatives --config |

LOL! Ficou com vontade de ter um recurso desse no seu Pinguim? Então, como uso fedora, vou passar o procedimento para obter esses efeitos nele. Se você usa outra distro, procure por esse pacote e instale ele. No caso do fedora, é bem simples.  Instale o pacote bash-completion no seu sistema:

# yum install bash-completion

E é somente isso. 🙂

Você pode ver uma lista de comandos que permitem utilizar o recurso de auto-completar listando o conteúdo do diretório /etc/bash_completion.d:

$ ls /etc/bash_completion.d

Onde cada arquivo nesse diretório se refere a um comando do sistema.

É até possível criar suas funções que permitem auto-completar comandos que você queira ou de programas que criou, mas isso está fora do escopo desse post. Só com esses você já terá muitos comandos com esse recurso.

Shell Script: Extrair trechos de uma linha


Acompanhando meus feeds, vi um post interessante do InFog com o título de Expressões Regulares:  Casar texto entre chaves .  Nesse post, ele demonstra como obter um texto que se encontra entre chaves em uma linha usando a linguagem Python e PHP.  Essa era uma coisa que eu estava procurando em meu aprendizado com Shell Script e resolvi tentar achar uma solução nessa linguagem.  Depois de umas tentativas sem sucesso, obtive ajuda de colegas da lista shell-script no Yahoo! Grupos.

Eis então duas abordagens interessantes:

Primeira: Obter os textos juntamente com as chaves.

Essa solução é a mais simples. Vou usar o mesmo texto que foi usado no post dele no script abaixo:

#!/bin/bash

texto="ola, {sou} uma string com {varios} caracteres {especiais}"

grep -o '[{][^}]*[}]' <<< "$texto"

Se executar esse script, a saída será:

{sou}
{varios}
{especiais}

Interessante! Mas eu ainda queria algo que também eliminasse as chaves e ficasse somente o texto dentro delas, cada um em uma linha. O sed é ótimo pra isso.

Segunda: Obter os textos sem as chaves na saída

#!/bin/bash

texto="ola, {sou} uma string com {varios} caracteres {especiais}"

sed '
        s/^[^{]*[{]//;
        s/[}][^{]*[{]/\n/g;
        s/[}].*$//
' <<< "$texto"

O primeiro comando do sed apaga do início da linha até a primeira chave. O segundo, substitui todo o conteúdo entre as chaves por um caractere de nova linha (\n) e o terceiro apaga desde a última chave até a final da linha.

E se executarmos o script…

sou
varios
especiais

Exatamente como eu queria!

Categorias:Linux, Shell Script Tags:, , ,