java - 使用 Java 获取 awk 返回值

标签 java linux shell unix terminal


我正在为我们的 Java 应用程序编写一个简单的 shell 命令。我没有使用 Linux shell 的经验,需要一个简单的命令。我尝试做的是获取用户的 Activity 窗口的进程名称。从另一个问题我找到了一个脚本如下:

ps -e | grep $(xdotool getwindowpid $(xdotool getwindowfocus)) | grep -v grep | awk '{print $4}'

来源:https://unix.stackexchange.com/questions/38867/is-it-possible-to-retrieve-the-active-window-process-title-in-gnome

我能够测试并打印结果但是。无法从 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/

相关文章:

java - 包装类 - 为什么整型文字对 Long 失败但对任何更小的东西都有效

java - 有没有办法实现无锁的解决方案来保证跨多个实例的数据完整性

linux - 获取不在 file2 中的 file1 行

java - 执行包含 java -jar Runtime.exec() 的 shell 脚本,它将使用哪个 java,操作系统级别还是应用程序级别

java - 如何调用抽象类的方法?

java - "<T> T get()"是什么意思? (还有用吗?)

linux - 用于大读取的 PTRACE_PEEKDATA 的替代方案

linux - 共享库安装

c - 2个子进程之间的管道不产生任何输出

linux - 使用linux shell脚本使用sed替换 "\"