如何在C ++中将字符串作为shell脚本执行?

时间:2014-08-02 00:29:32

标签: c++

我编写的程序需要能够执行用户提供的shell脚本。我已经让它执行一个shell命令,但提供的脚本会比这更复杂。

谷歌搜索到了以下代码片段:

FILE *pipe;
char str[100];

// The python line here is just an example, this is *not* about executing
// this particular line.
pipe = popen("python -c \"print 5 * 6\" 2>&1", "r");

fgets(str, 100, pipe);
cout << "Output: " << str << endl;

pclose(pipe)

这一点str中包含30。到现在为止还挺好。但是如果命令在其中有回车符,如shell脚本文件那样,如下所示:

pipe = popen("python -c \"print 5 * 6\"\nbc <<< 5 + 6 2>&1", "r");

有了这个,我的目标是str最终有30\n11

换句话说,假设我有一个包含以下内容的文件:

python -c "print 5 * 6"
bc <<< 5 + 6

我上面发送给popen的论点是该文件的字符串表示。我希望,在C ++中,将该字符串(或类似的东西)发送给bash并使其执行完全如同我在shell中并使用. file.sh来源,但将str变量设置为如果在那里执行了我会在shell中看到的内容,在本例中为30\n11

是的,我可以将其写入文件并以这种方式工作,但这似乎不应该是。

我不会认为这是一个新问题,所以我要么以完全错误的方式思考它,要么就是那些我根本不了解它的图书馆这样做。

1 个答案:

答案 0 :(得分:1)

使用bash -c

#include <stdio.h>

int main()
{
    FILE *pipe = popen("bash -c \"echo asdf\necho 1234\" ", "r");
    char ch;
    while ((ch = fgetc(pipe)) != EOF)
        putchar(ch);
}

输出:

asdf
1234

(我对cygwin进行了测试)