我正在为我们的 Java 应用程序编写一个简单的 shell 命令。我没有使用 Linux shell 的经验,需要一个简单的命令。我尝试做的是获取用户的 Activity 窗口的进程名称。从另一个问题我找到了一个脚本如下:
ps -e | grep $(xdotool getwindowpid $(xdotool getwindowfocus)) | grep -v grep | awk '{print $4}'
我能够测试并打印结果但是。无法从 Java 端获取值。但是,如果我运行一个简单的脚本,比如
echo asdasd
我可以很好地获取“asdasd”字符串。据我了解,Java 只能获取回显命令。
在java端我使用这个方法: 私有(private)字符串执行命令(字符串命令){
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[] args = {"/bin/sh","-c",command };
“命令”是脚本本身而不是文件路径,因为它给出了错误。
最佳答案
从 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 编写脚本文件,执行它然后删除它。
关于java - 使用 Java 获取 awk 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26335236/