Volcar salida de REPL

Volcar salida de REPL

Estoy escribiendo programas SML y me gustaría encontrar una forma de ver rápidamente el resultado de ejecutar un programa en REPL sin ejecutar realmente REPL (para ver rápidamente si un programa tiene errores de sintaxis; planeo usar esto como herramienta de creación). programa para archivos .sml en vim para ver la salida dentro de vim). Actualmente, tengo esto:

sml file.sml | echo -e "\004"

Entonces ejecuta el programa y luego repite Ctrl-D para salir de REPL. El problema es que es demasiado rápido enviar la tecla Ctrl-D, por lo que no hay resultado. Probé esto también:

sml file.sml | sleep 2 ; echo -e "\004"

Pero eso tampoco es suficiente. ¿Alguna idea sobre cómo puedo obtener un volcado del resultado del REPL?

Respuesta1

No, el problema es que no entiendes bien cómo funcionan las tuberías.

En los pipelines de Unix, los datos fluyende izquierda a derecha(la misma dirección que el texto escrito en inglés): la salida del primer programa se convierte en la entrada del segundo programa. Pero las tuberías son unidireccionales; La salida del segundo programa no se envía al primer programa.

Cuando corres sml file.sml | echo -e "\004", tuno lo sonhaciendo eco de Ctrl+D para sml. En cambio, eressmlsalida de la tubería al echocomando– donde se descarta, ya que echono usa stdin.

  1. teclado → sml file.smlecho -e "\004"→ pantalla

Su segundo intento, sml file.sml | sleep 2 ; echo -e "\004", tiene un problema similar: la salida de smlse envía a sleep(que también descarta la entrada que recibe). Sin embargo, hay otro problema: el echocomando ahora no forma parte del proceso en absoluto; se podría decir que |tiene mayor precedencia que ;. (Puedeagrupar comandos usando paréntesis; p.ej a | (b; c; d).)

  1. teclado → sml file.smlsleep 2→ pantalla
  2. teclado → echo -e "\004"→ pantalla

Como ya se dijo anteriormente, ambos intentos están escritos en eldirección incorrecta. Si quisieras enviar el \004personaje a sml, la canalización debería haberse escrito así:

echo -e "\004" | sml file.sml

en el cual, smlla salida de 'va a la pantalla, donde debería.

Hayotro problema, sin embargo. También eresconfundir la CtrlDpulsación de tecla con el "fin de entrada"evento.

La traducción de CtrlDa "fin de entrada" solo ocurre en la capa del dispositivo terminal; en otras palabras, solo cuando ingresa el carácter Ctrl+D en la ventana de su terminal. Sin embargo, cuando se utiliza echo -e "\004"en una tubería, esnotraducido automáticamente a "fin de entrada"; en su lugar, se escribe el byte real 004 [octal].

Si realmente desea decirle al programa que no hay más entradas, entoncesno escribas nada. Utilice un comando que no genere nada, por ejemplo, echo -no true, o simplemente redirija la entrada del /dev/nullarchivo.

echo -n | sml file.sml

sml file.sml < /dev/null

información relacionada