У меня сложилось впечатление, что процессы в операционной системе имеют три стандартных потока: stdin, stdout, and stderr
. Я также подумал, что текстовые редакторы, такие как vim, работают, принимая входные данные через stdin
и отправляя управляющие символы ANSI через stdout
. Однако мой взгляд на то, как интерпретаторы командной строки не выдерживают в этом одном случае:
Когда я запускаю команду C:\cygwin\bin\bash.exe
, мне предлагается:
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$
... но когда я запускаю его на Java со следующим фрагментом, поток stdin становится пустым:
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();
Что здесь происходит? Мне сказали, что bash.exe работает в интерактивном режиме. Означает ли это, что стандартные потоки не используются? Как мне по-прежнему работать с этими программами и, в конечном итоге, как реализовать собственную версию cmd.exe? Мне кажется, я не понимаю что-то фундаментальное о том, как работают интерпретаторы командной строки ...
(Любые ссылки на статьи, обсуждающие смежные темы, были бы очень благодарны. Мне не повезло в поисках. О, и последний вопрос, стандартные потоки обрабатываются по-другому в Windows, чем в большинстве Unix-подобных операционных систем? )