我试图在我的java代码中执行弹性搜索帖子查询。我希望使用bash shell在我的机器上执行代码。这是我的代码:public class Elastic {public static void main(String[] args) {String cmd = "curl -X PUT IP:PORT/twitter/_doc/10 -H 'Content-Type:
application/json' -d '{ \"user\" : \"Bob\", \"post_date\" : \"2019-12-15T14:12:10\", \"message\" : \"trying out Elasticsearch\" }' ";
try {Process pr = Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
e.printStackTrace();
}/*
try {
Runtime.getRuntime().exec("/bin/bash "+"-c "+"\'"+cmd+"\'");
} catch (Exception e) {
e.printStackTrace();
} */System.out.println("===============");System.out.println(cmd);
}
}我已经尝试过两种不同的方式,你可以从已被注释掉的代码中看出来。我打印我构建的查询以验证它。当我在我的本地机器上执行此程序并在终端中尝试打印的查询时,它可以工作,但不能在我的java代码/ bash查询中。我想这与格式化和单引号的使用有关,但我还没有能够直接从我的代码中运行它。
3 回答
翻阅古今
TA贡献1780条经验 获得超5个赞
最好的方法
请参阅其他答案,了解更好的方法。
如何解决这个问题
这是您当前方法的正确(并且棘手)引用:
String cmd = "curl -X PUT IP:PORT/twitter/_doc/10 -H '"\'"'Content-Type: application/json'"\'"' -d '"\'"'{ \"user\" : \"Bob\", \"post_date\" : \"2019-12-15T14:12:10\", \"message\" : \"trying out Elasticsearch\" }'"\'"' ";[...]Runtime.getRuntime(). exec("/bin/bash "+"-c "+"'"+cmd+"'");
在单引号内传递给shell的字符串中,通过结束当前单引号('
),启动双引号("
),添加转义单引号(\'
),关闭双引号("
)并继续单引号来转义其他单引号- 引用字符串('
)。
放在一起,我们写这个,因为它变成'"\'"'
了上下文。bli '"\'"'single-quote-inside-json'"\'"' bla
/bin/bash -c 'bli '"\'"'single-quote-inside-json'"\'"' bla'
为什么这么复杂?
有必要的原因可以在bash(1)手册页中找到:
单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。
这就是为什么我们必须结束单引号,启动双引号(单引号可以转义),结束双引号,并再次继续我们的单引号。
人到中年有点甜
TA贡献1895条经验 获得超7个赞
添加回答
举报
0/150
提交
取消