
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, eressml
salida de la tubería al echo
comando– donde se descarta, ya que echo
no usa stdin.
- teclado →
sml file.sml
→echo -e "\004"
→ pantalla
Su segundo intento, sml file.sml | sleep 2 ; echo -e "\004"
, tiene un problema similar: la salida de sml
se envía a sleep
(que también descarta la entrada que recibe). Sin embargo, hay otro problema: el echo
comando 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)
.)
- teclado →
sml file.sml
→sleep 2
→ pantalla - teclado →
echo -e "\004"
→ pantalla
Como ya se dijo anteriormente, ambos intentos están escritos en eldirección incorrecta. Si quisieras enviar el \004
personaje a sml
, la canalización debería haberse escrito así:
echo -e "\004" | sml file.sml
en el cual, sml
la 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 -n
o true
, o simplemente redirija la entrada del /dev/null
archivo.
echo -n | sml file.sml
sml file.sml < /dev/null