【发布时间】:2017-01-13 17:59:30
【问题描述】:
我一直在使用与此示例类似的代码从 C++ 中获取 Linux shell 命令的结果。它似乎适用于基本命令。但是,当我尝试使用示例中的命令运行它时,我得到了 shell 错误:意外标记附近的语法错误 `('
#include <stdio.h>
#include <iostream>
int main(int argc, char *argv[]) {
std::string cmdString = "cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | "
"awk -v RS=\"\" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) }' 2>&1";
std::string result, file;
FILE *stream;
std::cout << "cmdString = " << cmdString << std::endl;
stream = popen(cmdString.c_str(), "r");
char buffer[256];
if(fgets(buffer, sizeof(buffer), stream) != NULL) {
file = buffer;
result += file.substr(0, file.size() - 1);
}
pclose(stream);
std::cout << "result = " << result << std::endl;
return 0;
}
我做错了吗?我需要以某种方式重新格式化字符串吗?
【问题讨论】:
-
“我做错了吗?” - 我会说'是',基于你正在向外壳调用这个简单的事实。仅此一项就引发了巨大的警钟并引发了许多危险信号。至少非常需要非常仔细地完成类似的事情 - 仔细检查输入参数,确保环境正常,检查错误,确保运行可执行文件你真的打算等等等等。
-
此命令是否在 shell 本身中工作?
-
不要指望你的命令会被
bash执行。 POSIX 要求popen中使用的 shell 是/bin/sh。 -
@Drop 取决于你所说的“the” shel...