Transférer des données vers le stdin d'un processus sans provoquer ultérieurement d'EOF

33

J'ai un exécutable qui démarre un shell interactif. Je voudrais, au lancement du shell, injecter d’abord quelques commandes, puis permettre à l’utilisateur d’avoir sa session interactive. Je peux le faire facilement en utilisant echo:

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

Cela fonctionne presque . Le problème est que la commande echo qui alimente le stdin du processus frappe EOF une fois que cela est fait, faisant écho à mes commandes. Cela provoque la fin immédiate du shell (comme si vous aviez appuyé sur Ctrl + D dans le shell).

Existe-t-il un moyen d’injecter ces commandes dans stdin sans provoquer un EOF par la suite?

Jason R
la source
Avez-vous essayé d'ajouter ./shell_executableà la fin de la liste des commandes? Cela pourrait continuer, bien que vous ayez deux instances en cours d'exécution (parent et enfant).
goldilocks

Réponses:

40

Trouvé cette réponse intelligente dans une question similaire à stackoverflow

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

Cela fait l'affaire. catva pomper la sortie de echodans le flux d’entrée de shell_executable et attendre plus d’entrées jusqu’à EOF.

Gowtham
la source
@ jw013 Vous avez raison. J'ai édité le post. Merci. Quand j'ai expérimenté sans les parenthèses, j'ai vu cmd 1un retour écrit, mais je ne me suis pas rendu compte que cela aurait dû être celui généré parcmd 1
Gowtham
CECI FONCTIONNE IMPRESSIONNANT! Vous venez de me sauver une tonne de temps. Merci!!
Jaggedsoft
22

La manière la plus propre de le faire est probablement de chercher quelque chose comme bashl' --rcfileoption. Placez vos commandes personnalisées dans votre fichier personnalisé et transmettez-les au shell interactif pour qu'elles s'exécutent au démarrage.

Si aucune option de ce type n'existe, vous pouvez également essayer les solutions suivantes:

cat custom_commands_file - | ./shell_executable

catva interpréter -comme stdin.

jw013
la source
très bonne solution
dctremblay