Como posso enviar caracteres para um comando como se viessem de um arquivo?
Por exemplo, eu tentei:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
Em shells que suportam aqui strings , incluindo bash
, zsh
e ksh93
, você pode usar
wc <<< "apple pear orange"
Duas outras abordagens (que permitem entrada de várias linhas sem esforço extra):
Use um "documento aqui":
A
EOF
sequência é um delimitador. Você pode usar qualquer string;EOF
é apenas uma escolha convencional.Use o tty como entrada:
Isso tem a desvantagem de que o programa começa a ser executado e começa a ler a entrada assim que você digita seu nome. Isso pode ser desconcertante; por exemplo:
fonte
<<<
formulário também permite entrada de várias linhas sem esforço extra, pois a"
cadeia de caracteres -enclosed pode conter novas linhas. É claro que o<< EOF
formulário (a sintaxe original do documento aqui) é mais fácil de ler se você tiver entrada com várias linhas.<<<
word
- é claro, no contexto do shell, aword
pode ser uma string citada, contendo espaços e novas linhas! D'oh! Isso é tão óbvio que nem é preciso dizer (e, de fato, não vejo isso mencionado na página de manual). :-( Obrigado por me indicar isso!word
é definido na página de manual como "Uma sequência de caracteres considerados como uma única unidade pelo shell" (também conhecida como "token") e você precisa saber que as seqüências de caracteres entre aspas são tratadas como "uma única unidade" no sentido relevante (após processamento de barra invertida, expansão variável etc. "Mas, na verdade, esse é o objetivo de fazer aspas duplas no shell. (As aspas simples também protegem da expansão.) O modelo de processamento do shell é muito bem pensado e é tudo menos simples.Embora existam várias soluções válidas aqui outra sintaxe que pode ser às vezes úteis, é executar um comando no
<()
. Isso permitiria criar mais de um objeto descritor de arquivo em uma linha de comando.Isso pode ser útil quando você estiver fazendo algo como comparar longas sequências 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 precisar copiar o arquivo hosts no host local:
O
<
redireciona um arquivo para STDIN e()
cria um subshell para executar o comando entre 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 1 "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.
fonte
<fileorpathname
redireciona stdin, mas<(subcmd)
não; ele substitui um nome que quando / se aberto pelo programa pode ler stdout do subcmd.< <(subcmd)
(espaço necessário) faz redirecionamento stdin a partir desse ficheiro, quase comosubcmd |
. Vocêdiff
pode ler uma das entradas do stdin especificando um argumento,-
mas não ambos.cmd <(cmd2 ...)
ecmd < <(cmd2 ...)
. O primeiro permite que dados derivados (a saída do cmd2) sejam usados no lugar de um nome de arquivo. O último é equivalente acmd2 ... | cmd
. Os comandos devem ser escritos para aceitar explicitamente a entrada stdin e muitos não. Isto é especialmente verdade nos scripts de shell.você pode usar um cachimbo
fonte
Você pode usar algo semelhante ao esperado. A seguir, é apresentado um exemplo simples de como abrir uma sessão remota de telnet, aguardando o prompt, enviar alguns dados, aguardar uma resposta, dormir e sair.
fonte