Выполнить команду, используя popen

0

У меня есть программа 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")

Благодарю.

  • 0
    Не уверен, что это ошибка транспонирования, но похоже, что вы можете пропустить заключительную одинарную кавычку во второй подоболочке perl. Я полагаю, у вас это работает в командной строке?
  • 0
    Работал в cmd. Это ошибка транспонирования.
Теги:
diff
popen

1 ответ

0

Я знаю, что я не отвечаю на ваш вопрос, но общее решение, как только вы достигнете этого множества уровней цитирования, - это написать простой сценарий оболочки, а затем вызвать его из popen.

Например, popen ("/path/diffscript.sh", "r");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню