使用popen执行命令

时间:2013-11-24 18:39:03

标签: c++ perl diff popen

我有一个C ++程序,我想在其中执行以下命令:

cmd = "(diff <(perl -ne 's/^\\S+\\s//; if ((/aaa/ .. /bbb/) && /ccc/)"
            " { print \"$_\"}' file1)"
            "<(perl -ne 's/^\\S+\\s//; if ((/aaa/ .. /bbb/) && /ccc/)"
            " { print \"$_\"} file2)) ";

当我想执行此命令时,我收到此错误:

Search pattern not terminated at -e line 1.

我注意到以下命令的工作原理如下:

cmd = "diff <(echo aa) <(echo bb)"
string strCall = "bash -c \"( " + cmd + " ) 2>&1\"";
stream = popen(strCall.c_str(),"r"); // doesn't work popen(**str**.c_str(),"r")

和包含'“'的perl命令示例如下:

cmd = "perl -ne '{print \"$1\"}' file"
stream = popen(str.c_str(),"r"); // doesn't work  popen(**strCall**.c_str(),"r");

但如果perl命令不包含'“',则它可以双向运行:

cmd = "perl -ne '{print $1}' file"
string strCall = "bash -c \"( " + cmd + " ) 2>&1\"";
stream = popen(str.c_str(),"r"); // also works popen(**strCall**.c_str(),"r");

如何在同一命令中同时使用diff和perl。我假设我必须使用strCall。 我也试过像这样逃避perl cmd,但它不起作用:

cmd = "perl -ne '{print \\\"$1\\\"}' file" // one '/' for '/', one for "'" and one for '"'.

它也不起作用,但我不允许使用R(“str”):

cmd = R"(perl -ne '{print \"$1\"}' file)"
string strCall = "bash -c \"( " + cmd + " ) 2>&1\"";
stream = popen(strCall.c_str(),"r")

感谢。

1 个答案:

答案 0 :(得分:0)

我知道我没有回答你的问题,但是一旦达到这个多级别的引用,一个常见的解决方案就是编写一个简单的shell脚本然后从popen调用它。

例如,popen(“/ path / diffscript.sh”,“r”);