【发布时间】:2011-04-08 09:15:12
【问题描述】:
我一直认为操作系统上的进程具有三个标准流:stdin, stdout, and 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$
...但是当我使用以下 sn-p 在 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 操作系统中的处理方式有什么不同吗? )
【问题讨论】:
-
写一个Java CLI交互程序会很有趣
-
您需要在运行 java 程序之前关闭 shell 中的输入缓冲(然后再将其重新打开,以便您可以编辑命令)。一些晦涩的
stty命令或我不记得的东西。
标签: java shell command-line stream ansi