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 sml4"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"sml4"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"sml4
- teclado →
sml→echo -e "→ telaecho -n4" - 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