我正在为我们的Java应用程序编写一个简单的shell命令。我没有Linux shell的经验,需要一个简单的命令。我尝试做的是获取用户的活动窗口的进程名称。从另一个问题我发现了一个脚本如下:
ps -e | grep $(xdotool getwindowpid $(xdotool getwindowfocus)) | grep -v grep | awk '{print $4}'
我可以测试并打印结果但是。无法从Java端获得价值。但是,如果我运行像
这样的简单脚本echo asdasd
我可以得到“asdasd”字符串就好了。据我所知,Java只能获得echo命令。
在java方面我使用这个方法: private String executeCommand(String command){
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
来源:http://www.mkyong.com/java/how-to-execute-shell-command-from-java/
------ ------解决
感谢smasseman的回答,但是我用以下的String数组改变了命令String,
String[] args = {"/bin/sh","-c",command };
“command”是脚本本身而不是文件路径,因为它给出了错误。
答案 0 :(得分:1)
从java执行管道时,不能使用管道。诀窍是将您的linux命令和管道写入脚本并从java执行该脚本。 创建此脚本(让我们调用脚本activewin.sh):
#!/bin/bash
ps -e | grep $(xdotool getwindowpid $(xdotool getwindowfocus)) | grep -v grep | awk '{print $4}'
Make是可执行的chmod +x activewin.sh
然后,您可以在java p = Runtime.getRuntime().exec("./activewin.sh");
你当然可以从java编写脚本文件,执行它然后删除它,如果你希望你的应用程序更“独立”。
答案 1 :(得分:0)
我会使用Apache Comons Exec。