我一直认为操作系统上的进程具有三个标准流: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 中运行它时,标准输入流是空的:
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 操作系统中的处理方式有什么不同吗?)