2013-11-24 54 views
0

我有一个C++程序中,我想执行以下命令的命令:当我想执行这个命令执行使用POPEN

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命令的工作方式类似于S:

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") 

谢谢。

+0

不确定它是否是转位错误,但看起来您可能会错过第二个perl子shell中的结束单引号。我假设你在命令行上有这个工作? – codnodder

+0

在cmd中工作。这是一个转位错误。 –

回答

0

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

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