Quais são alguns usos práticos do redirecionamento STDIN? [fechadas]

0

Estou com dificuldades para pensar em um único uso prático para o redirecionamento STDIN. cat < /etc/passwd é um exemplo de redirecionamento STDIN, mas é bobagem da mesma forma que um uso inútil de cat. Eu uso o Linux há 15 anos e não consigo pensar em uma única vez em que precisei de redirecionamento STDIN. Alguém tem algum exemplo prático disso?

    
por Daniel Amaya 17.09.2014 / 22:52

6 respostas

3

Oh, você é um professor ...

mysql -uUSERNAME -p < sqlfile.sql 
sort < domain_list.txt > sorted_domain_list.txt

Contando palavras de um texto:

root@debian:/home/mohsen# wc -c << EOF
>     This is a simple lookup program 
>     for good (and bad) restaurants
>     in Cape Town.
> EOF
90
    
por 17.09.2014 / 22:57
2

Existem vários casos, este é um deles. Aplicando um patch de kernel:

cd linux-3.16.2 && patch -p1 < patch-3.16.2-3
    
por 17.09.2014 / 22:57
1

Redirecionamento de entrada padrão (stdin)

No Linux, o comando cat é usado para imprimir o conteúdo de um arquivo. No entanto, se o comando cat for executado sem qualquer argumento de entrada, por padrão ele tenta ler a partir da entrada padrão (stdin) e porque stdin está vinculado ao teclado, portanto, ele apenas espera que o usuário digite algo.

  # cat
   Hello World!    This is the input typed on the standard input
   Hello World!    This is the output printed by cat command on the standard output

Nós executamos o comando cat e depois digitamos "Hello World!". O comando cat aceitou o texto digitado na entrada padrão e redirecionou o mesmo para a saída padrão. É por isso que você está vendo a sequência "Hello World!" Duas vezes. Você precisa pressionar ctrl + D para recuperar o acesso do console.

Exemplo prático:

          any_prog < inputfile 2>errorfile
    
por 17.09.2014 / 23:00
1

Bom ol ' ed :

$ cat file.txt 
foo
bar
baz
$ cat edcommands.txt 
,s/ba/ta/
w
q

$ ed file.txt < edcommands.txt 
12
12
$ cat file.txt 
foo
tar
taz

(Embora, claro, para um comando tão curto, você só faria printf ",s/ba/ta/\nw\nq" | ed file.txt .;))

    
por 18.09.2014 / 01:19
0

Você normalmente deseja o redirecionamento de stdin para enviar algum arquivo como uma entrada para algum comando. Isso acontece principalmente em scripts, onde você pode ter resultados temporários armazenados em um arquivo. Dependendo do contexto, pode-se usar um pipe (para que um arquivo temporário não seja necessário) ou um arquivo temporário com redirecionamento de stdin (uma vantagem é que controlar erros de maneira portátil através do status de saída é mais fácil).

Agora, alguns comandos podem aceitar a entrada como um argumento e, nesse caso, o redirecionamento de stdin não é necessário ... em geral. Mas o interessante é que pode haver diferenças dependendo de como a entrada é fornecida, de modo que um uso inútil de cat possa realmente ser útil. Vamos dar um exemplo: gzip .

$ echo foo > text
$ gzip -k text
$ file text.gz
text.gz: gzip compressed data, was "text", last modified: Thu Sep 18 00:38:18 2014, from Unix

Aqui, um recebe o registro de data e hora do arquivo text . Então, em vez de fornecer o text filename como argumento, vamos usar um redirecionamento:

$ gzip < text > text.gz
$ file text.gz
text.gz: gzip compressed data, last modified: Thu Sep 18 00:38:18 2014, from Unix

Um ainda recebe o mesmo timestamp, mas o nome do arquivo original não é mais armazenado no arquivo compactado (o was "text" desapareceu). Agora, vamos usar um pipe, com o que parece ser um uso inútil de cat :

$ cat text | gzip > text.gz
$ file text.gz
text.gz: gzip compressed data, last modified: Thu Sep 18 00:43:46 2014, from Unix

Desta vez, o timestamp foi alterado: é a data / hora em que o gzip foi executado, não o timestamp do arquivo text .

Então, dependendo do que você quer e do tipo de comando, você tem 3 soluções diferentes que parecem equivalentes, mas na verdade dão resultados ligeiramente diferentes.

Observação: outro exemplo é o comando lpr printing, para o qual você pode usar um redirecionamento em vez de um nome de arquivo como argumento, se não quiser que o nome do arquivo vaze na fila da impressora.

    
por 18.09.2014 / 00:50
0

Suponho que você esteja perguntando especificamente sobre o redirecionamento de um programa para um arquivo, com a sintaxe cmd < file . Eu pergunto porque a sua pergunta, conforme solicitado, é um tanto ambígua. Afinal, cmd1 | cmd2 está redirecionando o stdin de cmd2 , também.

  1. Quando você precisa de um programa para ler de um arquivo quando o programa não recebe um parâmetro de entrada de nome de arquivo. Como você apontou, cat < file e sort < file são exemplos em que < não é necessário, porque você pode dizer cat file e sort file . O exemplo de fkraiem de colocar comandos ed em um arquivo e depois dizendo ed parameter_file < commands_file é ótimo.
  2. Quando você precisa de um programa para ler de um arquivo quando o programa se comporta de forma diferente se um parâmetro de nome de arquivo de entrada é dado versus quando está lendo stdin. O único exemplo que conheço é wc , onde wc -l < filename outputs number_of_lines , mas wc -l filename outputs number_of_lines   filename , que é muito mais difícil de usar em um script. IMNSHO, este é um bug em wc , mas aí está.
  3. Quando você quiser fazer algo com valores de um arquivo de texto:

    while read var1 var2 …
    do
        code using var1, var2, etc…
              ︙
    done < file
por 18.09.2014 / 01:58