我正在尝试使用类似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中使用,而不是写入文件中。
任何帮助将不胜感激,如果还有其他方法,请提出建议
答案 0 :(得分:3)
在终端机中进行echo foo >> bar
时,有两个重要区别:
echo
是内置的bash
命令(与/bin/bash
中的PATH
相对)-但这不是很重要,因为两者的行为相同;和
>>
由bash
处理,而不作为打印参数提供给echo
。 bash
负责解析命令行,处理重定向以及诸如处理变量替换之类的其他事情。在这种情况下,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)