我编写的程序需要能够执行用户提供的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
。
是的,我可以将其写入文件并以这种方式工作,但这似乎不应该是。
我不会认为这是一个新问题,所以我要么以完全错误的方式思考它,要么就是那些我根本不了解它的图书馆这样做。
答案 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进行了测试)