C++ 从C code system()函数执行的Linux命令与从终端执行时给出的结果不同

C++ 从C code system()函数执行的Linux命令与从终端执行时给出的结果不同,c++,bash,C++,Bash,我正在使用system()函数从我的C代码运行一系列Linux命令。从C代码运行这些命令的结果与从终端运行这些命令的结果不同。例如: std::string name("\\pot\ "); std::stringstream extractInfoCmd; extractInfoCmd<<"find . -name \"*.info\" | xargs grep -E \"^PART|^"<<name.c_str()<<"\" >> inform

我正在使用system()函数从我的C代码运行一系列Linux命令。从C代码运行这些命令的结果与从终端运行这些命令的结果不同。例如:

std::string name("\\pot\ ");
std::stringstream extractInfoCmd;
extractInfoCmd<<"find . -name \"*.info\" | xargs grep -E \"^PART|^"<<name.c_str()<<"\" >> information.rpt";
std::string extractInfoCmdStr = extractInfoCmd.str();
printf("\n##DEBUG Command: %s\n", extractInfoCmdStr.c_str());
system(extractInfoCmdStr.c_str());
现在,如果我从终端执行相同的命令(从上面的调试日志接收),我将得到两行代码。但是如果我从C system()函数执行相同的命令,我只得到第一行,而不是第二行:

PART: 6

很久以来,我一直在调试它,它的原因对我来说并不突出。

编译器会解释
名称
字符串中的反斜杠,然后使用该字符串构建
extractInfoCmd
字符串,并将其传递给shell(
/bin/sh
)试图再次解释它们。因此,传递给
grep
进程的实际字符串不是您想要的字符串

解决这个问题的最好方法可能是避免使用
system
,而是使用类似于
execlp
的方法,在这里可以分别传递每个参数

也不需要使用管道将信息从
find
传递到
grep
,您可以使用
find
本身:

find . -name '*.info' -exec grep -E '^PART|^\\pot\ ' {} \;
或者,直接在C中:

execlp(
    "/usr/bin/find",
    ".",
    "-name",
    "*.info",
    "-exec",
    "grep",
    "-E",
    "^PART|^\\\\pot\\ ",
    "{}",
    ";",
    NULL);

与使用shell将输出管道化到文件不同,您只需在流程中使用
管道
,即可获得管道,直接查找
的标准输出,然后从中读取。

启动终端和程序时,是否从同一目录启动?(您正在执行<代码>查找< /COD>,从当前目录<代码> .<代码>)中得到流<代码> FrHuSH()//>代码> ED.@多米尼克-是在同一个目录中,可能是由于应该在CC++字符串中逃出的反斜杠,还请注意,在C++字符串中,反斜杠后面跟着空格就像一个空间,你没有显示终端命令。无论如何,我会尝试在运行终端管道的程序和shell上运行
strace-f
。使用正确的输出/详细参数,它将准确地显示每个参数运行的命令行,您可以直接比较它们。此外,由于系统字符串参数中的双引号,反斜杠必须再加倍一次,但是系统正在创建额外的
sh
进程并等待其终止
execlp(
    "/usr/bin/find",
    ".",
    "-name",
    "*.info",
    "-exec",
    "grep",
    "-E",
    "^PART|^\\\\pot\\ ",
    "{}",
    ";",
    NULL);