Como posso enviar caracteres para um comando como se eles viessem de um arquivo?

22

Como posso enviar caracteres para um comando como se eles viessem de um arquivo?

Por exemplo, tentei:

wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
    
por Tyler Durden 22.01.2017 / 20:07

5 respostas

32

Em shells compatíveis com strings aqui , incluindo bash , zsh e ksh93 , você pode usar

wc <<< "apple pear orange"
    
por 22.01.2017 / 20:11
18

Duas outras abordagens (que permite entrada de várias linhas sem esforço extra):

  1. Use um "documento aqui":

    $ wc << EOF
    apple pear orange
    EOF
      1       3      18
    $

    A string EOF é um delimitador. Você pode usar qualquer string; EOF é apenas uma escolha convencional.

  2. Use o tty como entrada:

    $ wc
    apple pear orange
    Ctrl+D
      1       3      18
    $

    Isso tem a desvantagem de o programa começar a ser executado e começa a ler a entrada, assim que você digita o nome dela. Isso pode ser desconcertante; por exemplo:

    $ grep v
    The quick brown fox             (typed)
    jumps over                      (typed)
    jumps over                      (This is output from grep!)
    the lazy dog.                   (typed)
    Ctrl+D
                                    (No output here)
    $
por 23.01.2017 / 03:27
10

Embora existam várias soluções válidas aqui, outra sintaxe que pode ser útil às vezes é executar um comando em <() . Isso permitiria que você criasse mais de um objeto descritor de arquivo em uma linha de comando.

Isso pode ser útil quando você está fazendo algo como comparar longas cadeias de texto ou se quiser diferenciar algum conteúdo que não esteja em um arquivo.

Por exemplo, comparando os arquivos hosts em dois nós sem ter que copiar o arquivo hosts para o localhost:

diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')

O < redireciona um arquivo para STDIN e o () cria uma sub-shell para executar o comando entre os parênteses. É o STDOUT do subshell que é passado para STDIN do comando que está sendo executado.

É uma maneira mais fácil de criar mais de um "arquivo" de entrada para um comando do que tentar usar vários documentos aqui, ou tentar repetir vários comandos em um pipeline para o comando final.

    
por 23.01.2017 / 04:04
8

você pode usar um pipe

echo "apple pear orange" | wc
    
por 22.01.2017 / 20:24
0

Você pode querer usar algo semelhante para esperar. A seguir, um exemplo simples de abrir uma sessão remota de telnet, aguardar o prompt, enviar alguns dados, aguardar uma resposta, dormir e sair.

#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1
    
por 23.01.2017 / 15:49

Tags