Dump output from REPL

1

Estou escrevendo programas SML, e gostaria de ver rapidamente a saída da execução de um programa no REPL sem realmente executar o REPL (para ver rapidamente se um programa tem erros de sintaxe - planejo usar este como um programa make para arquivos .sml no vim para visualizar a saída dentro do vim) .. Atualmente, eu tenho isso:

sml file.sml | echo -e "sml file.sml | sleep 2 ; echo -e "%code%4"4"

Portanto, ele executa o programa e, em seguida, faz o Ctrl-D para sair do REPL. O problema é que é rápido demais para enviar a tecla Ctrl-D, então não há saída. Eu tentei isso também:

%code%

Mas isso não está fazendo isso também. Alguma idéia de como eu posso obter um despejo da saída do REPL?

    
por Ankit Soni 30.09.2012 / 13:54

1 resposta

3

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 "sml4" , você não está ecoando Ctrl + D para 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.

  1. teclado → echo -e "sml file.sml | sleep 2 ; echo -e "sml4"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 "sml44" .)

  1. teclado → smlecho -e "echo -n4" → tela
  2. 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
    
por 30.09.2012 / 16:35

Tags