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

发布于 2022-09-13 00:42:19 字数 1166 浏览 46 评论 0

我使用 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 中是可以正常运行的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文