J'ai été sous l'impression que les processus sur le système d'exploitation ont trois flux standard: stdin, stdout, and stderr
. J'ai également pensé que les éditeurs de texte comme vim travaillent en prenant des entrées sur stdin
et en envoyant des caractères d'échappement ANSI sur stdout
. Cependant, mon point de vue de la façon dont les interprètes de ligne de commande ne tient pas dans ce seul cas:Comment les interprètes en ligne de commande fonctionnent-ils?
Quand je lance la commande C:\cygwin\bin\bash.exe
, je suis invité avec:
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Users\masson>C:\cygwin\bin\bash.exe
bash-3.2$
... mais quand je lance en Java avec l'extrait suivant, le flux stdin est vide:
ProcessBuilder pb = new ProcessBuilder("C:\\cygwin\\bin\\bash.exe");
pb.redirectErrorStream(true);
Process proc = pb.start();
final InputStream in = proc.getInputStream();
new Thread(new Runnable() {
public void run() {
// Blocks forever...
in.read(new byte[1024]);
}
}).start();
ce qui se passe ici? On m'a dit que bash.exe s'exécute en mode interactif. Cela signifie-t-il que les flux standards ne sont pas utilisés? Comment puis-je encore travailler avec ces programmes, et finalement, comment pourrais-je implémenter ma propre version de cmd.exe? Je pense que je ne comprends pas quelque chose de fondamental sur la façon dont les interprètes en ligne de commande fonctionnent ...
(Tous les liens vers des articles traitant de sujets connexes seraient très appréciés.) Je n'ai pas eu beaucoup de chance de chercher. question, les flux standard sont-ils traités différemment dans Windows que dans la plupart des systèmes d'exploitation de type Unix?)
Ce serait intéressant d'écrire un programme interactif CLI Java – TheLQ
Vous devez désactiver la mise en mémoire tampon d'entrée dans votre shell avant d'exécuter le programme Java (et le rallumer après pour que vous puissiez éditer vos commandes). Une obscure commande 'stty' ou quelque chose dont je ne me souviens plus. –