Existe uma maneira de fazer isso efetivamente no bash:
/my/bash/script < echo 'This string will be sent to stdin.'
Estou ciente de que poderia canalizar a saída do eco como este:
echo 'This string will be piped to stdin.' | /my/bash/script
bash
redirect
stdin
io-redirection
Todos os trabalhadores são essenciais
fonte
fonte
echo
>
formulário de redirecionamento abrirá um descritor de arquivo como fd0
(stdin), enquanto o|
opens inicia um processo filho e o anexa stdout (fd 1) ao stdin do outro processo. Este facto pode ter consequências não triviais (pense sobre o compartilhamento de variáveis de ambiente?)Respostas:
Você pode usar uma linha
heredoc
o acima é o mesmo que
ou você pode redirecionar a saída de um comando, como
ou você pode ler como
ou simplesmente
fonte
echo -e "\x01\x02..." | ./script
)<<<
? Tenho vergonha de admitir que nunca o vi antes e estou totalmente confuso com isso. Eu tentei pesquisar no Google por isso, mas meus resultados não têm relação.Você estava perto
Para entrada multilinha, os documentos aqui são adequados:
Editar Para os comentários:
Para obter entrada binária, diga
Se você substituir
cat
para/my/bash/script
(ou mesmo cair o último tubo), este impressões:Ou, se você quiser algo um pouco mais nerd:
Quais são os senos dos primeiros 90 graus em flutuadores binários de 4 bytes
fonte
xxd -r
(ouod
) para filtrar o documento HEREVocê também pode usar
read
assimfonte
Solução
Você deseja (1) criar saída stdout em um processo (como
echo '…'
) e (2) redirecionar essa saída para entrada stdin de outro processo, mas (3) sem o uso do mecanismo bash pipe. Aqui está uma solução que corresponde às três condições:O
<
é redirecionamento de entrada normal para stdin. A<(…)
é substituição processo de bater. Grosso modo, ele cria um/dev/fd/…
arquivo com a saída do comando substituto e passa esse nome de arquivo no lugar do<(…)
, resultando aqui, por exemplo, emscript < /dev/fd/123
. Para detalhes, veja esta respostaComparação com outras soluções
Um heredoc de uma linha enviado ao stdin
script <<< 'string'
apenas permite enviar seqüências estáticas, não a saída de outros comandos.Somente a substituição do processo, como em
diff <(ls /bin) <(ls /usr/bin)
, não envia nada para o stdin. Em vez disso, a saída do processo é passada como o conteúdo dos arquivos criados em segundo plano, equivalente a, por exemplodiff /dev/fd/10 /dev/fd/11
. Nesse comando,diff
não obtém entrada do stdin.Casos de uso
Gosto disso, diferentemente do mecanismo de pipe, o
< <(…)
mecanismo permite colocar o comando em primeiro lugar e todas as entradas depois dele, como é o padrão para entrada nas opções da linha de comando.No entanto, além da estética da linha de comando, há alguns casos em que um mecanismo de tubulação não pode ser usado. Por exemplo, quando um determinado comando deve ser fornecido como argumento para outro comando, como neste exemplo, com
sshpass
.fonte
<<<
?Permite digitar várias linhas em um programa, sem que essa entrada seja salva no histórico nem visível em
ps
. Basta pressionar Ctrl + C quando terminar de digitar para finalizarcat
.fonte
fonte
function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }
. Em terceiro lugar, este sed seria muito mais compreensível com o awk:awk -F '\n' 'ORS=" " { print } END { printf "\n"}'