在Mac OS X上通过Java程序使用命令写入文件

时间:2018-10-16 06:15:39

标签: java macos terminal

我正在尝试使用类似echo的命令将变量写入~/.bash_profile,但无法将其写入文件。 我尝试了以下方法,

Runtime run = Runtime.getRuntime();
    String line = null;
    try {
        Process pr = run.exec("echo \"export ANDROID_HOME=/Users/abc/Documents/platform-tool\" >> ~/.bash_profile");
        pr.waitFor();
        BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        while ((line = buf.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        logger.error("Error occurred when getting adb " + e.getMessage());
    } catch (InterruptedException ie) {
        logger.error("Error occurred when getting adb " + ie.getMessage());
        Thread.currentThread().interrupt();
    }

我也尝试给出'而不是\“,只是回显导出,但它没有写入该文件。 当我尝试打印输出时,它会打印

"export ANDROID_HOME=/Users/abc/Documents/platform-tool" >> ~/.bash_profile

但是文件为空。

我也尝试过使用printf,但这再次不起作用。这些命令也可以在终端中使用,但可以在Java中使用,而不是写入文件中。

任何帮助将不胜感激,如果还有其他方法,请提出建议

1 个答案:

答案 0 :(得分:3)

在终端机中进行echo foo >> bar时,有两个重要区别:

  • echo是内置的bash命令(与/bin/bash中的PATH相对)-但这不是很重要,因为两者的行为相同;和

  • >>bash处理,而不作为打印参数提供给echobash负责解析命令行,处理重定向以及诸如处理变量替换之类的其他事情。在这种情况下,Java将解析命令行,并将其直接交给程序。

因此,实质上,您正在执行:

'/bin/echo' '"export ANDROID_HOME=/Users/abc/Documents/platform-tool\"' '>>' '~/.bash_profile'

如果您在Terminal中尝试 that ,它将执行与Java调用的echo相同的事情。

要执行您想要的操作,您需要运行一个shell(例如bash)来处理重定向:

run.exec("bash -c 'echo \"export ANDROID_HOME=/Users/abc/Documents/platform-tool\" >> ~/.bash_profile'")

但是,这里要提出的一个自然问题是-为什么使用Java调用bash来调用echo ...? 为什么不只使用Java?How to append text to an existing file in Java