2012-01-13 4 views
1

J'essaye d'implémenter un émulateur de terminal en Java. Il est supposé pouvoir héberger à la fois cmd.exe sous Windows et bash sur des systèmes de type Unix (je voudrais supporter au moins Linux et Mac OS X). Le problème que j'ai est que les deux cmd.exe et bash répètent sur leur sortie standard tout ce que j'envoie à leur entrée standard. Par exemple, dans bash, je tape "ls", appuyez sur Entrée, à quel point l'émulateur de terminal envoie la ligne d'entrée à stdin de bash et vide le flux. Le processus sort ensuite à nouveau la ligne d'entrée "ls\n" puis la sortie de la commande ls.Implémentation de l'émulateur de terminal - problèmes avec entrées répétées

Ceci est un problème, car d'autres programmes, à l'exception de bash et cmd.exe, ne le font pas. Si je cours, à l'intérieur de bash, ou cmd.exe, la commande "python -i", le shell interactif python ne répète pas l'entrée de la manière bash et cmd.exe fait. Cela signifie qu'une solution de contournement devrait savoir de quel processus provient la sortie réelle. Je doute que ce soit ce que les émulateurs terminaux réels font. L'exécution de "bash -i" ne change pas ce comportement. Pour autant que je sache, cmd.exe n'a pas de modes "interactif" et "non-interactif" distincts.


EDIT: Je crée le processus hôte en utilisant la classe ProcessBuilder. Je lis le stdout et stderr et écrit au stdin du processus en utilisant une technique semblable à la stream gobbler. Je ne définis aucune variable d'environnement avant de démarrer le processus hôte. Les commandes exactes que j'utilise pour démarrer les processus sont bash -i pour bash et cmd pour cmd.exe. Je vais essayer de poster un exemple de code minimal dès que je parviens à en créer un.

+0

Cela semble pertinent pour 'bash': cacher l'entrée de l'utilisateur. http://www.tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script/ Je ne sais pas à quel point c'est portable. – Piskvor

+2

C'est drôle, 'echo ls | bash ne fais rien comme ça. –

+0

En effet, ce n'est pas le cas, même si je le lance dans mon émulateur de terminal. Je suppose que cela a quelque chose à voir avec bash sachant que l'entrée provient d'un tuyau. – Honza

Répondre

4

Sous Unix, exécutez stty -echo pour désactiver l'écho local (c'est-à-dire le shell qui répète tout ce que vous tapez). Ceci est généralement activé pour qu'un utilisateur puisse modifier ce qu'il tape.

Dans votre cas, BASH doit en quelque sorte allouer un pseudo TTY; sinon, cela ne ferait pas écho à toutes les commandes. set +x aurait un effet similaire, mais alors, vous verriez + ls au lieu de ls dans la sortie.

Avec cmd.exe, la commande @ECHO OFF devrait obtenir le même effet. Exécutez-les simplement après que le processus a été créé et que cela devrait fonctionner.

Questions connexes