Canalizar datos al stdin de un proceso sin causar EOF después


33

Tengo un ejecutable que inicia un shell interactivo para el usuario. Al iniciar el shell, me gustaría inyectar algunos comandos primero y luego permitir que el usuario tenga su sesión interactiva. Puedo hacer esto fácilmente usando echo:

echo "command 1\ncommand 2\ncommand3" | ./shell_executable

Esto casi funciona. El problema es que el comando echo que está alimentando el stdin del proceso golpea EOF una vez que se hace eco de mis comandos. Este EOF hace que el shell termine inmediatamente (como si hubiera presionado Ctrl + D en el shell).

¿Hay alguna manera de inyectar estos comandos en stdin sin causar un EOF después?


¿Has intentado agregar ./shell_executableal final de la lista de comandos? Eso podría seguir funcionando, aunque tendrá dos instancias en ejecución (padre e hijo).
Ricitos de Oro

Respuestas:


40

Encontré esta respuesta inteligente en una pregunta similar en stackoverflow

(echo -e "cmd 1\ncmd 2" && cat) | ./shell_executable

Esto hace el truco. catbombeará la salida echoa la secuencia de entrada de shell_executable y esperará más entradas hasta EOF.


@ jw013 Tienes razón. Edité la publicación. Gracias. Cuando experimenté sin los paréntesis, vi cmd 1escrito de nuevo pero no me di cuenta de que debería haber sido el o / p generado porcmd 1
Gowtham el

¡ESTO FUNCIONA IMPRESIONANTE! Me acabas de salvar un montón de tiempo. ¡¡Gracias!!
jaggedsoft el

22

La forma más limpia de hacer esto es probablemente buscar algo como bashla --rcfileopción. Coloque sus comandos personalizados en su archivo personalizado y páselo al shell interactivo para que se ejecute al inicio.

Si no existe tal opción, también puede intentar lo siguiente:

cat custom_commands_file - | ./shell_executable

catinterpretará -como stdin.


muy buena solución 💪😠
dctremblay
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.