2009-10-13 7 views
7

Tengo un programa (que no escribí) que no está diseñado para leer los comandos de un archivo. Ingresar comandos en STDIN es bastante tedioso, por lo que me gustaría poder automatizarlo escribiendo los comandos en un archivo para su reutilización. El problema es que, si el programa llega a EOF, se repite infinitamente tratando de leer en el próximo comando, dejando caer un torrente interminable de opciones de menú en la pantalla.¿Cambiar de contenido de archivo a STDIN en comando de canalización? (Consola de Linux)

Lo que me gustaría hacer es cargar un archivo que contenga los comandos en el programa a través de una tubería, luego usar algún tipo de magia de shell para que cambie del archivo a STDIN cuando llegue al EOF del archivo .

Nota: Ya he considerado usar cat con '-' para STDIN. Desafortunadamente (no sabía esto antes), los comandos interconectados esperan a que finalice la salida del primer programa antes de iniciar el segundo programa; no se ejecutan en paralelo. Si hay alguna manera de hacer que los programas se ejecuten en paralelo con ese tipo de acción de canalización, ¡eso funcionaría!

¿Alguna idea? Gracias por cualquier ayuda!

EDIT:

Debo señalar que mi objetivo es no sólo para evitar que el sistema de golpear el final del archivo comandos. Me gustaría poder continuar escribiendo comandos desde el teclado cuando el archivo llegue a EOF.

Respuesta

15

Me gustaría hacer algo como

 
(cat your_file_with_commands; cat) | sh your_script 

De esta manera, cuando el archivo con los comandos se realiza, la segunda cat alimentará a su guión con lo que escribe en la entrada estándar después.

+2

¿Puedes * hacer eso? * No tenía idea de que pudieras agrupar comandos. Ese es mi algo nuevo para el día. Esto me impide tener que usar una segunda ventana. ¡Muchas gracias, Idelic! – zslayton

+0

Para aquellos que estén interesados, puede construir en el archivo que contiene comandos a medida que avanza, usando: (cat your_file_with_commands; tee -a your_file_with_commands) | sh your_script que agregará cada comando al archivo además de pasarlo a la secuencia de comandos a través de la tubería. – zslayton

+0

+1 Esto me ayudó en el nivel 1 del juego de guerra narnia en intruded.net – chmeee

1

Ha intentado utilizar algo como tail -f commandfile | command Creo que debe canalizar las líneas del archivo para comando sin cerrar el descriptor de archivo después. Use -n para especificar el número de líneas que se canalizarán si tail -f no las detecta todas.

+0

que es una buena idea, pero por desgracia no me deja continuar a introducir comandos después de que el archivo se ha completado. (Debería haber sido más claro al respecto en mi publicación; lo editaré). Si escribe 'tail -f commandfile' para intentar cambiar a STDIN después de leer el archivo, se queja: advertencia: la siguiente entrada estándar indefinidamente es ineficaz ¡Gracias por la idea! – zslayton

+1

¿Ha intentado anexar líneas al archivo usando 'echo something >> commandfile'? 'tail -f' también debe rastrear esas adiciones. –

+0

¡Ja! Estaba * solo * intentando eso. Voy a comentar nuevamente si funciona. (El programa tarda un tiempo en ponerse en marcha.) – zslayton

2

Creo que expect funcionaría para esto.

2

Igual respuesta Idelic con una sintaxis más sencilla;)

cat your_file_with_commands - | sh your_script 
Cuestiones relacionadas