Não, o problema é que você está entendendo mal como os canos funcionam.
Em pipelines Unix, os fluxos de dados da esquerda para a direita (a mesma direção que o texto escrito em inglês) - a saída do primeiro programa se torna a entrada do segundo programa. Mas os tubos são unidirecionais; a saída do segundo programa não é enviada para o primeiro programa.
Quando você executa sml file.sml | echo -e "
, você não está ecoando Ctrl + D para sml
4"sml
. Em vez disso, você está enviando a saída echo
para o comando echo
- onde é descartado, pois sml file.sml
não usa stdin.
- teclado →
echo -e "
→sml file.sml | sleep 2 ; echo -e "
4"sml
4"sleep
→ tela
Sua segunda tentativa, echo
, tem um problema semelhante - a saída de |
é enviada para ;
(que também descarta a entrada que recebe). No entanto, há outro problema: o comando a | (b; c; d)
agora não faz parte do pipeline; Você poderia dizer que sml file.sml
tem uma precedência maior que sleep 2
. (Você pode agrupar comandos usando parênteses ; por exemplo, echo -e "
.)
4"sml
4
- teclado →
sml
→echo -e "
→ telaecho -n
4" - teclado →
true
→ tela
Como já foi dito acima, as duas tentativas estão escritas na direção errada . Se você quisesse enviar o caractere /dev/null
para %code% , o pipeline deveria ter sido escrito assim:
echo -e "echo -n | sml file.sml
sml file.sml < /dev/null
4" | sml file.sml
em que, a saída de %code% vai para a tela, onde deveria.
Existe outro problema , no entanto. Você também está confundindo a tecla Ctrl D com o evento "fim da entrada" .
A conversão de Ctrl D para "fim da entrada" ocorre apenas na camada do dispositivo de terminal - em outras palavras, somente quando você insere o caractere Ctrl + D na sua janela do terminal. No entanto, quando você usa %code% em um pipe, ele não é traduzido automaticamente para "end of input"; em vez disso, o byte real 004 [octal] é escrito.
Se você quiser realmente dizer ao programa que não há mais entrada, então não escreva nada . Use um comando que não produza nada - por exemplo, %code% ou %code% ou apenas redirecione a entrada do arquivo %code% .
echo -e "echo -n | sml file.sml
sml file.sml < /dev/null
4" | sml file.sml