Introdução às redirecionamentos de shell de batida

Introdução às redirecionamentos de shell de batida

Objetivo

Aprenda a usar redirecionamentos, tubos e tee na casca de bash

Sistema operacional e versões de software

  • Sistema operacional: - Distribuição Linux AGNOSTIC

Requisitos

  • Acesso a uma casca de festa

Convenções

  • # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
  • $ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular

Introdução

Redirecionamento é a capacidade de redirecionar a entrada e saída de vários comandos de e para arquivos ou dispositivos. Vamos ver como o redirecionamento funciona em Bash: o shell padrão na maioria das distribuições Linux.



Descritores de arquivo

Toda vez que você executa um programa, três Descritores de arquivo são criados por padrão:

  • 0 - stdin (entrada padrão)
  • 1 - stdout (saída padrão)
  • 2 - stderr (erro padrão)

Por padrão, o stdout e stderr Os descritores estão "anexados" à tela, o que significa que a saída do programa e seus erros não são salvos em nenhum arquivo, mas apenas exibidos, enquanto a entrada padrão é anexada ao teclado. Operadores de redirecionamento nos vamos manipular essas associações.

Redirecionando a saída padrão

Como dito acima, por padrão, a saída padrão de um programa é enviada para a tela, mas em algumas circunstâncias, como por exemplo, no contexto de um script, podemos querer descartá -lo, ou talvez enviá -lo para um arquivo. Como podemos fazer isso? A chave aqui é o> operador:

ls -l> saída.TXT 

Neste pequeno exemplo, redirecionamos a saída do ls comando para a saída do arquivo.txt (observe que o arquivo não precisa existir, é criado automaticamente). Nada apareceu na tela, mas se verificarmos o conteúdo do arquivo, veremos algo bastante familiar:



$ CAT Output.TXT TOTAL 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 Documentos DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Downloads drwxrwxr-x. 13 EGDOC EGDOC 4096 23 de junho 08:13 Git drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:36 Música -RW-RW-R--. 1 EGDOC EGDOC 0 23 de junho 09:38 Saída.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:39 fotos drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:36 Public drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Modelos DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 Vídeos 

O que vemos é a saída do ls comando. Se agora tentarmos o redirecionamento novamente, o conteúdo atual do arquivo será substituído pela nova saída. Como podemos preservar o conteúdo anterior, e apenas acrescentar novas linhas para isso? Nesse caso, usamos o >> operador:

ls -l >> saída.TXT 

Dessa forma, se o arquivo não existir, ou não tiver conteúdo, o redirecionamento terá o mesmo efeito como se usássemos o > Operador, caso contrário, o novo conteúdo será anexado ao existente, como você pode ver observando o arquivo novamente:

Total 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 Documentos DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Downloads drwxrwxr-x. 13 EGDOC EGDOC 4096 23 de junho 08:13 Git drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:36 Música -RW-RW-R--. 1 EGDOC EGDOC 0 23 de junho 09:38 Saída.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:39 fotos drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:36 Public drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Modelos DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 Vídeos Total 40 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 Documentos DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Downloads drwxrwxr-x. 13 EGDOC EGDOC 4096 23 de junho 08:13 Git drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:36 Música -RW-RW-R--. 1 EGDOC EGDOC 541 23 de junho 09:38 Saída.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:39 fotos drwxr-xr-x. 2 EGDOC EGDOC 4096 22 de junho 19:36 Public drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Modelos DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junho 19:36 Vídeos 


Também podemos precisar redirecionar a saída de vários comandos de uma só vez: podemos obter o resultado desejado usando aparelhos encaracolados para agrupá -los:

$ echo "linuxconfig"; ls -l; > saída.TXT

A saída.arquivo txt, agora conterá a string 'LinuxConfig' e o resultado do ls -l comando.

Outra operação comum é descartar completamente a saída de um comando, desta vez redirecionando -o para um dispositivo especial: /dev /null. Em sistemas operacionais do tipo Unix /dev/null (Também conhecido como Bit Bucket), é um dispositivo que descarta todos os dados escritos a ele:

ls -l> /dev /null

Redirecionar a saída padrão e o erro padrão

Nos exemplos acima, acabamos de redirecionar a saída padrão. Se ocorrer algum tipo de erro, ainda poderemos ver a mensagem de erro na tela:

$ ls -l inexistingfile.txt> /dev /null ls: não é possível acessar.txt ': nenhum arquivo ou diretório 

Isso acontece porque, como dito acima, stdout e stderr Os descritores são completamente separados um pelo outro. O que podemos fazer, então, para redirecionar os dois? Existem duas sintaxes que podemos usar para realizar esta tarefa: a primeira, que funciona mesmo em versões antigas do shell, é a seguinte:

ls -l> saída.txt 2> & 1

O que nos fizemos? Primeiro de tudo, redirecionamos o stdout do comando para a saída.arquivo txt, assim como fizemos antes, então redirecionamos o stderr para o stdout. Observe como referenciamos os descritores de arquivos por seus respectivos números. Para uma versão Bash razoavelmente moderna, podemos usar essa outra sintaxe mais simplificada:

LS -L &> Saída.TXT


Redirecionar a saída padrão para erro padrão

Imagine que você está escrevendo um script e deseja lidar com um caso quando uma instrução específica falha, mostrando ao usuário uma mensagem de erro. Como você conseguiria isso? A primeira coisa que vem à mente é apenas eco a mensagem desejada e provavelmente saia do script com o código de erro apropriado. Isso seria perfeitamente bom, mas pergunte a si mesmo, em que descritor esta mensagem será 'enviada'? É o stdout do eco comando, mas ao mesmo tempo, se virmos coisas da perspectiva do script, como uma mensagem de erro, ele deve usar o stderr descritor. O que queremos fazer aqui é redirecionar stdout para stderr. Usamos a seguinte sintaxe para realizar a tarefa:

eco "ocorreu um erro, tchau!"> & 2

Certamente não é o mais útil das mensagens de erro, mas é suficiente para o nosso exemplo.

Redirecionando a entrada padrão

Como dissemos antes, por padrão, a entrada padrão está associada ao teclado, mas usando o < Operador, podemos fazer alguns programas para aceitar informações de outras fontes. Vamos ver um exemplo rápido usando o tr comando (como você provavelmente sabe tr é usado para excluir ou traduzir caracteres). Normalmente funciona desta maneira:

tr 'goot tay!'t d

Você dá tr uma string, primeiro especificando o personagem que você deseja mudar, e depois a que deve usar para substituí -la. Nesse caso, passamos pela string 'Goot Tay!'diretamente, usando o teclado: ele será traduzido para' bom dia!'. O que faremos para demonstrar stdin redirecionamento, é escrever a string em um arquivo e depois redirecionar o conteúdo do arquivo para o stdin do tr comando.

Primeiro, escrevemos 'Goot Tay!'Para a saída.arquivo txt

$ echo 'goot tay!'> saída.TXT

Então enviamos seu conteúdo para o stdin de tr:

$ tr < output.txt t d good day! 

Como você pode ver tudo foi o esperado, e uma boa mensagem foi impressa na tela.



Pipelines

Usando o operador de tubo | Podemos encadear vários comandos, para que o stdout do comando à esquerda do operador é passado para o stdin do comando à direita dele. Podemos demonstrar rapidamente isso, usando o tr comando novamente:

$ Echo 'Goot Day!'| TR T D Bom dia! 

O que aconteceu? A saída padrão do comando echo (consistindo na string 'goot tay!') é canalizado para a entrada padrão do tr comando, que traduz a string. Finalmente, vemos tr saída padrão na tela. Mas é claro que o tubo pode continuar. Imagine que queremos que a palavra 'boa' seja exibida:

$ echo 'goot tay!'| TR T D | corte -f 1 -d "

O que fizemos aqui é adicionar o corte comando para o tubo, passando pelo stdout de tr para o seu stdin. O corte O comando usa o espaço como delimitador (-d interruptor) e seleciona apenas o primeiro campo, retornando a string 'boa'.

Usando tee

O Tee O comando lê a entrada padrão e redireciona -a para saída padrão e para um arquivo ao mesmo tempo, possibilitando criar um 't' em nosso tubo. Vamos reutilizar o exemplo acima, desta vez enviando o resultado intermediário ('bom dia!') também para a saída.Arquivo TXT:

$ echo 'goot tay!'| TR T D | Tee OUPUT.txt | corte -f 1 -d "

A saída na tela será a mesma de antes ('boa'), mas se lermos a saída.arquivo txt, podemos ver que o 'bom dia!'String foi escrita para isso. Isso ocorre porque 'bom dia!'foi a saída padrão que fluía no tubo quando inserimos nosso Tee.

Tee também é útil algumas circunstâncias específicas. Por exemplo, se você tentar 'ecoar' algo para um arquivo que precisa de privilégios root para serem escritos, notará que as coisas não irão como esperado:

$ sudo echo "linuxconfig.org "> protegido.txt -bash: protegido.txt: permissão negada 


O que aconteceu? Você provavelmente esperava que o comando fosse bem -sucedido, porque você o prefixou com sudo, mas falhou de qualquer maneira. Isso é porque você acabou de executar o eco comando com privilégios, mas isso não lhe deu permissões de escreva no arquivo. Vamos tentar desta maneira: em vez disso:

$ echo "linuxconfig.org "| sudo tee protegido.txt> /dev /null

Aqui corremos eco como um usuário normal, mas o redirecionamento em si é realizado com privilégios de raiz, então desta vez o comando é bem -sucedido. Também adicionamos um redirecionamento extra para /dev/null, Porque não precisávamos da saída para ser exibida na tela.

Observe que, usando esta técnica, a saída não será anexada ao arquivo de destino: o último será substituído e seu conteúdo anterior será perdido. Para anexar o arquivo, devemos adicionar o -a troque para Tee (abreviação para -pend).

Tenha cuidado, apenas um pouco de distração aqui pode causar coisas horríveis!

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Introdução aos tubos nomeados na casca de bash
  • Manipulando a entrada do usuário em scripts bash
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Mastering Bash Script Loops
  • Arquivos de configuração do Linux: os 30 primeiros mais importantes
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Linux pode obter vírus? Explorando a vulnerabilidade do Linux…
  • Download do Linux