Conectando e expandindo comandos

25 25America/Sao_Paulo dezembro 25America/Sao_Paulo 2017 Off Por Sidney silva santos

Um recurso verdadeiramente poderoso do shell é a capacidade de redirecionar a entrada e saída de comandos para e de outros comandos e arquivos. Para permitir agrupar comandos, o shell utiliza metacaracteres. Um metacaractere é um caractere digitado que tem um significado especial para o shell  para conectar comandos ou solicitar expansão.

Metacaracteres incluem o caractere de barra vertical ou pipe (|), o “e” comercial (&), ponto e vírgula (;), parêntese direito ( ) ), parêntese esquerdo ( ( ), sinal de menor que (<) e maior que (>). As próximas seções descrevem como usar  metacaracteres na linha de comando para mudar a maneira como os comandos se comportam.

O metacaractere de redirecionamento (|) conecta a saída de um comando à entrada de outro comando.

Isso permite que você tenha um comando funcionando sobre alguns dados e, então, o próximo comando lidando com os resultados. Eis um exemplo de uma linha de comando que inclui barras verticais:

$ cat /etc/passwd | sort | less

[caption id="attachment_941" align="aligncenter" width="450"]Captura de tela de 2017-12-25 08-41-36.png Saida do comado[/caption]

Esse comando lista o conteúdo do arquivo /etc/passwd e redireciona a saída para o comando sort.O comando sort leva os nomes que começam cada linha do arquivo /etc/passwd, classificando-os em ordem alfabética, e redireciona a saída para o comando less (para a página por meio da saída).

As barras verticais são uma excelente ilustração de como o UNIX, o predecessor do Linux, foi criado como um sistema operacional composto de blocos de construção.

Uma prática padrão no UNIX era conectar utilitários de maneiras diferentes para realizar trabalhos. Por exemplo, antes dos processadores de texto gráficos, os usuários criavam arquivos de texto simples que incluíam macros para indicar a
formatação. Para ver como o documento realmente aparecia, eles utilizavam um comando como o seguinte:

$ gunzip < /usr/share/man/man1/grep.1.gz | nroff -c -man | less

[caption id="attachment_942" align="aligncenter" width="450"]Captura de tela de 2017-12-25 08-44-36.png Saída do comando[/caption]

Nesse exemplo, o conteúdo da página man grep (grep.1.gz) é direcionado para o comando gunzip a ser extraído. A saída de gunzip é redirecionada para o comando nroff para formatar a página man usando a macro manual (-man). A saída é redirecionada para o comando less para exibir a saída.

Como o arquivo que está sendo exibido está em texto simples, você poderia ter substituído qualquer número de opções para trabalhar com o texto antes de exibi-lo e também classificar, alterar ou excluir algum conteúdo ou criar texto de outros documentos. A chave é que, em vez de todos esses recursos estarem em um programa, você obtém resultados a partir do redirecionamento da entrada e saída entre vários comandos.

Eventualmente você pode querer que uma sequência de comandos seja executada, com um comando sendo completado antes de o comando seguinte começar. Você pode fazer isso digitando vários comandos na mesma linha de comando e  separando-os com ponto e vírgulas (;):

$ date ; apt-get update ; apt-get upgrade -y

Alguns comandos podem demorar um pouco para serem concluídos. Às vezes você talvez não queira que seu shell espere que um comando termine. Nesses casos, você pode fazer os comandos executarem em segundo plano, usando o E comercial (&).

Comandos de formatação de texto (como nroff descrito anteriormente) são exemplos frequentemente executados em segundo plano para formatar um  documento grande. Você também pode criar seus próprios scripts que são  executados em segundo plano para verificar continuamente por certos acontecimentos, como o disco rígido encher ou usuários específicos efetuarem login.

Eis um exemplo de um comando a ser executado em segundo plano:

$ apt upgrade -y &

Não feche o shell até que o processo seja concluído, ou ele será destruído.

Utilizando metacaracteres para correspondência de arquivo

Para poupar-lhe alguns pressionamentos de tecla e para que você possa facilmente referenciar um grupo de arquivos, o shell bash permite usar metacaracteres.

Sempre que precisar referenciar um arquivo ou diretório, como para listá-lo, abri-lo ou excluí-lo, você pode usar metacaracteres para localizar osarquivos que deseja. Eis alguns metacaracteres úteis para corresponder nomes de arquivo:

* — Localiza qualquer número de caracteres.
? — Localiza qualquer caractere.
[…] — Localiza qualquer um dos caracteres entre os colchetes, o que pode incluir uma gama de letras ou números separados por hífen.

Experimente alguns desses metacaracteres de correspondência de arquivo primeiro indo para um diretório vazio (como o diretório test descrito na seção anterior) e criando alguns arquivos vazios:

$ touch apple banana grape grapefruit watermelon

O comando touch cria arquivos vazios. Os comandos a seguir mostram como usar metacaracteres de shell com o comando ls para localizar nomes de arquivos. Tente os seguintes comandos para ver se você tem as mesmas respostas:

$ ls a*
apple
$ ls g*
grape grapefruit
$ ls g*t
grapefruit
$ ls *e*
apple grape grapefruit watermelon
$ ls *n*
banana watermelon

O primeiro exemplo localiza qualquer arquivo que começa com um a (apple). O próximo exemplo combina todos os arquivos que começam com g (grape,  grapefruit). Em seguida, os arquivos que começam com g e terminam em t são localizados (grapefruit). Depois, qualquer arquivo que contém um e no nome é localizado (apple, grape, grapefruit, watermelon). Por fim, qualquer arquivo que contém um n é localizado (banana, watermelon).

Eis alguns exemplos de correspondência de padrões com o ponto de interrogação  (?):

$ ls ????e
apple grape
$ ls g???e*
grape grapefruit

O primeiro exemplo localiza qualquer arquivo de cinco caracteres que termina em e (apple, grape).

O segundo localiza qualquer arquivo que começa com g e tem como seu quinto caractere um e (grape, grapefruit).

Os exemplos a seguir usam colchetes para fazer a correspondência de padrões:

$ ls [abw]*
apple banana watermelon
$ ls [agw]*[ne]
apple grape watermelon

No primeiro exemplo, qualquer arquivo começando com a, b ou w é localizado. No segundo, qualquer arquivo que começa com a, g, ou w e também termina com um n ou um e, é localizado. Você também pode incluir intervalos entre colchetes. Por exemplo:

$ ls [a-g]*
apple banana grape grapefruit

Aqui, todos os nomes que começam com uma letra de a a g são localizados.

Utilizando metacaracteres para redirecionamento de arquivos

Comandos recebem dados da entrada padrão e os enviam para a saída padrão. Utilizando redirecionamentos (descritos anteriormente), você pode direcionar a saída padrão de um comando para a entrada padrão de outro. Com os arquivos, você pode usar os sinais menor que (<) e maior que (>) para direcionar dados de e para arquivos. Eis os caracteres de redirecionamento de arquivo:

< — Direciona o conteúdo de um arquivo para o comando. Na maioria dos casos, essa é ação padrão esperada pelo comando e o uso do caractere é opcional; utilizar less bigfile é o mesmo que less < bigfile.

> — Direciona a saída padrão de um comando para um arquivo. Se o arquivo existir, o conteúdo dele será sobrescrito.

2> — Direciona mensagens de erro padrão (standard error) para o arquivo.

&> — Direciona tanto a saída padrão como o erro padrão para o arquivo.

>> — Direciona a saída de um comando para um arquivo, adicionando a saída ao final do arquivo existente.

Eis alguns exemplos de linhas de comando em que a informação é dirigida de e para arquivos:

$ mail root < ~/.bashrc$ man chmod | col -b > /tmp/chmod
$ echo “Esse é o blog treino linux”$(date)” >> ~/projects

No primeiro exemplo, o conteúdo do arquivo .bashrc no diretório inicial é enviado em uma mensagem de mail para o usuário root do computador. A segunda linha de comando formata a página man chmod (usando o comando man), remove os espaços extras (col -b) e envia a saída para o arquivo /tmp/chmod (apagando o arquivo /tmp/chmod anterior, se ele existir). O comando final faz com que o seguinte texto seja adicionado ao arquivo project do usuário:

 Esse é o blog treino linux seg dez 25 10:11:22 -02 2017

Outro tipo de redirecionamento, referido como here text (também chamado here document), permite que você digite o texto que pode ser usado como entrada padrão para um comando. Here documents envolvem inserir dois sinais de menor que (<<) após um comando, seguidos de uma palavra. Toda digitação após a palavra é tomada como entrada do usuário até que a palavra seja repetida em uma linha sozinha. Eis um exemplo:

$ mail root sidney <<texto
>Olá sidiney estou enviando esse e-mail as 09:55.
> Neste blog você vai aprender linux.
>
> — sidney
> texto
$

Esse exemplo envia uma mensagem de e-mail para os usuários root, sidney. O texto inserido entre <<texto e texto torna-se o conteúdo da mensagem. Uma forma comum de usar here text é com um editor de texto para criar ou adicionar um arquivo a partir de dentro de um script:

/bin/ed /etc/resolv.conf <<resendit
a
nameserver 100.100.100.100
.
w
q
resendit

Com essas linhas adicionadas a um script executado pelo usuário root, o editor de texto ed adiciona o endereço IP de um servidor DNS ao arquivo /etc/resolv.conf.

Anúncios