我试图从java访问UNIX shell,但输出不同,我不确定原因。
public class Test {
public static void main(String[] args) throws IOException,InterruptedException {
List<String> arg = new ArrayList<>();
arg.add("echo");
arg.add("$PATH");
ProcessBuilder pb = new ProcessBuilder(arg);
Process p = pb.start();
BufferedReader br;
if (p.waitFor() == 0) {
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
} else {
br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
}
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
}
}
输出:
$ PATH
然后我尝试阅读~/.bashrc
文件以从那里读取PATH。
public class Test {
public static void main(String[] args) throws IOException,InterruptedException {
List<String> arg = new ArrayList<>();
arg.add("cat");
arg.add("<");
arg.add("~/.bashrc");
ProcessBuilder pb = new ProcessBuilder(arg);
Process p = pb.start();
BufferedReader br;
if (p.waitFor() == 0) {
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
} else {
br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
}
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
}
}
输出:
cat:&#39;&lt;&#39;:没有这样的文件或目录
cat:&#39;〜/ .bashrc&#39;:没有这样的文件或目录
答案 0 :(得分:0)
执行时:
cat < ~/.bashrc
你的shell解释了这个命令,并且在没有参数的情况下执行cat
,为其 stdin 提供~/.bashrc
的内容。
在这里,您直接使用2个参数cat
和<
调用~/.bashrc
(顺便提一下,这不是有效的文件名,~
需要解释)。
因此,除非您想通过~/.bashrc
的内容手动提供进程 stdin ,否则您可以通过替换以下内容启动 shell :
arg.add("cat");
arg.add("<");
arg.add("~/.bashrc");
由:
arg.add("bash");
arg.add("-c");
arg.add("cat < ~/.bashrc");
甚至更简单:
Collections.addAll(arg, "bash", "-c", "cat < ~/.bashrc");
甚至更简单:
ProcessBuilder pb = new ProcessBuilder("bash", "-c", "cat < ~/.bashrc");
答案 1 :(得分:0)
如果您需要PATH详细信息,可以使用
System.out.println(System.getenv("PATH"));