我一直以为操作系统上的进程有三个标准流: stdin、stdout 和 stderr
。我也认为像 vim 这样的文本编辑器通过从 stdin
获取输入并通过 stdout
发送 ANSI 转义字符来工作。然而,在这种情况下,我的命令行解释器的看法不成立:
当我运行命令 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操作系统中是否被处理得有所不同?)
stty
命令或其他我记不清的东西。 - Tom Hawtin - tackline