为什么从管道中执行bash命令报错?

bbbb
  • 15

我使用 boost::process 打开一个管道并从 stdout 中获取结果,最后在代码中拼出来的 bash 脚本粘贴到 shell 中是可以执行的,但是为什么在软件中报错呢?

读取的代码如下:

bp::ipstream is;
auto cmdString = fmt::format(R"RRR(bash -c 'echo `env LANG=en_US.UTF-8 {}`')RRR", cmd);
spdlog::debug(fmt::format("执行的命令是: {}", cmdString));
bp::child c(cmdString, bp::std_out > is);
std::vector<std::string> data;
std::string line;
while(c.running() && std::getline(is, line) && !line.empty()) data.push_back(line);
auto result = boost::join(data, "\n");
spdlog::debug("命令的结果为: {}", result);

代码运行的结果如下:

debug: 执行的命令是: bash -c 'echo `env LANG=en_US.UTF-8 getfacl /a/2 | egrep -v "(file:)|(owner: )|(group: )|(mask)" | tr "\n" ";" | sed "s/;;/\n/g" | sed "s/# //g"`'
`env: -c: line 1: unexpected EOF while looking for matching `''
`env: -c: line 2: syntax error: unexpected end of file
debug: 命令的结果为: 

也就是说最后拼出来的bash脚本是

bash -c 'echo `env LANG=en_US.UTF-8 getfacl /a/2 | egrep -v "(file:)|(owner: )|(group: )|(mask)" | tr "\n" ";" | sed "s/;;/\n/g" | sed "s/# //g"`'

但是这行代码在 bash 中是可以正常运行的

回复
阅读 216
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏