terça-feira, 22 de fevereiro de 2011

Conhecendo o zsh

Este artigo é uma tradução livre parcial e uma adaptação da matéria em http://www.tuxradar.com/content/z-shell-made-easy Consulte a fonte original para obter informações sobre os termos de uso.

A maioria das distribuições GNU/Linux atuais vem com o Bash como o shell padrão, mas existem muitos outros shells disponíveis para o usuário. Neste artigo, vamos introduzir o Zsh (Z shell), um shell que tem muitos dos benefícios do Bash e de outros, além de muito mais em cima. Depois de ler isto, você vai ter uma boa idéia sobre o poder da Zsh e será capaz de tomar uma decisão informada de mudar o shell padrão da sua distro. Nós olharemos mais para o uso interativo de Zsh e menos em scripts shell não interativo - ou seja, vamos focar o uso diário, e não sobre o script e automatização de tarefas. Neste artigo em especial, vamos ver os recursos de englobamento para listar, facilmente, vários tipos de arquivo e os aliases globais, que são recursos úteis mais ausentes no Bash.


Englobamento


Um recurso útil de muitos shells é o de englobamento, também conhecido como geração de nome de arquivos. Um exemplo que você provavelmente está familiarizado é quando você digita *. txt para significar todos os arquivos que terminam com a extensão .txt. O shell expande isso para a lista de todos esses arquivos, que é passada para o comando - por exemplo, como em ls *. txt.

No Bash, o englobamento é bastante limitado. Por exemplo: e se você quer listar todos os arquivos .txt em subdiretórios do diretório atual? Obviamente, você pode tentar ls */*.txt , mas isso apenas resulta em arquivos .txt que estão em subdiretórios imediatos. O zsh tem uma solução poderosa para casar arquivos recursivamente: ls **/*.txt , que retorna todos os arquivos .txt em todos os subdiretórios. Isto é tão potente que, muitas vezes, faz o comando find parecer redundante. Por exemplo: ao invés de find . -name *.txt | grep foo , o Zsh permite que você utilize o comando muito mais simples grep foo **/*.txt . Se você quiser que o Zsh siga links simbólicos, você pode usar ***/, mas atente para loops infinitos.

Fora isso, o Zsh também conhece [...] , que casa com quaisquer caracteres entre cochetes. Por exemplo: *.[cho] vai casar com todos os arquivos com a extensão .c, .h ou .o. Com [^...] ou [!...], Zsh vai casar com todos os caracteres que não estão entre cochetes.

Usando qualificadores


Qualificadores Globais são outra boa adição à Zsh: eles tem a capacidade de selecionar alguns tipos de arquivos ao usar algumas flags em parênteses no fim do padrão de englobamento. Por exemplo: para listar apenas os diretórios que estão dentro do diretório atual, utilize:

print *(/)


Você pode utilizar (.) para arquivos regulares apenas, (/) para diretórios, (*)para arquivos executáveis, (@) para links simbólicos, (=) para soquetes, (p) fpara pipes nomeados, (%) para arquivos de dispositivos, (%b) para arquivos de bloco e (%c) para arquivos de caracteres.

Da mesma forma, você também pode testar as permissões de arquivos: (r), (w) e (x) para arquivos que são lidos, graváveis e executáveis pelo proprietário, (R), (W) e (X) para aqueles com permissões para todos os usuários e (A), (I) e (E) para permissões de grupo. Por exemplo: para encontrar todos os arquivos dentro do diretório atual, tente:

ls **/*(.x)


Se você preferir utilizar os argumentos simbólicos que o comando chmod conhece, então você também pode fazer isso:

print *(f:gu+rw,o-rwx:)


Outro qualificador global útil testa pelo usuário ou grupo que é o dono de um arquivo. Para testar o seu próprio usuário ou grupo, é só usar (U) ou (G), respectivamente. Para outros usuários, você tem que adicionar o ID do usuário ou grupo ao (u) ou ao (g). Assim, com (u0) você pesquisa por todos os arquivos que pertencem ao usuário root e com (U1001) para todos os arquivos pertencentes ao usuário com ID 1001. Você também pode usar nomes se você delimitá-los com dois pontos: (u:andre:) seleciona os arquivos que pertencem ao usuário andre.

O Zsh também pode selecionar os arquivos pela hora de modificação ou acesso com (m) ou (a) respectivamente. Você pode pesquisar pelo momento exato, ou períodos anteriores (-) ou depois (+) do seu ponto escolhido. Este é dada em dias, por padrão, mas também pode ser medido em meses (M), semanas (w), horas (h), minutos (m) ou segundos (s).

Por exemplo: para pesquisar por todos os arquivos que você acessou na última semana, faça:

print **/*(.aw-1)


Ou você pode pesquisar os arquivos que você modificou na última hora:

print **/*(.m0)


Qualificadores de englobamento de tamanho de arquivos trabalham da mesma forma: (L) refere-se ao tamanho do arquivo, que é medido em bytes, por padrão, mas que também pode ser medido em quilobytes (k), em megadytes (m) ou em bloco de 512 bytes (p). Isto torna fácil, por exemplo, olhar para todos os arquivos do diretório atual que são maiores do que 1MB:

print *(Lm+1)


Esses qualificadores globais também podem ser combinados à vontade. O resultado pode ser comprido, mas se você entender o básico dos qualificadores, vai fazer sentido. Por exemplo: *(u0WLk+10m0) são arquivos pertencentes ao usuário root, passível de escrita, com mais que 10k em tamanho e modificados durante a última hora.

Aliases globais e de sufixo


Há outras formas com as quais o Zsh pode tornar sua vida mais fácil. Cada shell permite o uso de aliases. Assim, se você se encontrar muitas vezes utilizando os mesmos comandos, você pode definir um nome alternativo que é mais fácil de digitar. Isso o Bash também faz, mas o Zsh pode fazer muito mais.

Definir um alias é simples. Por exemplo: vamos dizer que você digita frequentemente ls -la. Você pode definir um alias lh deste modo:

alias lh="ls -lh"


Até aí nada demais, o Bash também faz isso, mas o Zsh permite que você defina aliases globais, que são aliases que não são a primeira palavra na linha de comando. Para fazer isso, utilize a opção -g no comando alias, como em:

alias -g L="|less"


Agora, você pode facilmente paginar a saída de outro comando adicionando L a ele, como por exemplo:

dmesg L


Outro tipo de variante são aliases de sufixo. Através deles, você pode abrir um arquivo qualquer em algum aplicativo como se este fosse um comando! Por exemplo, ao digitar a linha a seguir:

alias -s txt=vim


Toda a vez que você digitar o nome de um arquivo .txt na linha de comando, como se você estivesse digitando o nome de um programa, o vim será aberto com o arquivo digitado.

Você também pode criar aliases para diretórios, apesar de que estes não são definidos com o comando alias. Aliases já definidos pelo shell são ~ , que se expande para o diretório home do usuário atual e ~nomedousuario, que se expande para o diretório home do usuário informado. Por exemplo: se vocẽ digitar

hash -d down=~/Desktop/Downloads


você poderá acessar o diretório /Desktop/Downloads de qualquer lugar simplesmente digitando cd ~down.

Nenhum comentário:

Postar um comentário