У меня есть программа 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")
Благодарю.
Я знаю, что я не отвечаю на ваш вопрос, но общее решение, как только вы достигнете этого множества уровней цитирования, - это написать простой сценарий оболочки, а затем вызвать его из popen.
Например, popen ("/path/diffscript.sh", "r");