【问题标题】:What is the proper way to execute a complex shell command within C++?在 C++ 中执行复杂的 shell 命令的正确方法是什么?
【发布时间】: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...

标签: c++ linux shell


【解决方案1】:

您正在命令行中使用bash 特定的构造。 POSIX 要求将popen 的参数传递给bin/sh,而不是用户当前的shell。

要解决此问题,您可以执行以下操作之一:

  1. 将命令重写为符合/bin/sh 标准。
  2. 在命令行中显式使用bash
    std::string cmdString = "bash -c \".....\"";
  3. 完全放弃 shell,自己实现管道。

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2011-08-30
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多