Система ( "команда" ) создает ошибку; но он работает при вызове непосредственно из приглашения Bash
Я пытаюсь запустить следующую команду bash из моей программы на С++:
diff <(cat /etc/passwd) <(ls -l /etc)
со следующим оператором С++:
system("diff <(cat /etc/passwd) <(ls -l /etc)");
Команда отлично работает при запуске ее непосредственно из оболочки Linux, но при ее запуске из моей программы я получаю:
sh: 1: Syntax error: "(" unexpected
Что касается (
Я попытался выполнить (
с \
, но это создает больше проблем:
system("diff <\\(cat /etc/passwd\\) <\\(ls -l /etc\\)");
sh: 1: cannot open (cat: No such file
Все, что я хочу, это запустить следующее из моей программы на С++:
diff <(cat /etc/passwd) <(ls -l /etc)
Я могу создать файл и запустить его, но я оставляю это как последний вариант.
Ответы
Ответ 1
Как упоминалось, system()
создает новую стандартную оболочку sh
и выполняет команды. Поскольку <()
- это особенность bash, его нельзя интерпретировать с помощью sh
.
Вы можете обойти это, вызвав явно bash
и используя параметр -c
:
system("bash -c \"diff <(cat /etc/passwd) <(ls -l /etc)\"");
или используя строковый литерал:
system(R"cmd(bash -c "diff <(cat /etc/passwd) <(ls -l /etc)")cmd");
Здесь соответствующая часть страницы system(3)
:
Функция библиотеки system()
использует fork(2)
для создания дочернего процесса который выполняет команду оболочки, указанную в команде, используя execl(3)
следующим образом:
execl("/bin/sh", "sh", "-c", command, (char *) 0);
system()
возвращается после завершения команды.
Ответ 2
Вызов system(3)
вызывает /bin/sh
для обработки команды. Если вы хотите специально использовать функции bash
, вам нужно вставить bash -c
перед командной строкой, которая будет запускать bash
и сообщить ей, чтобы обработать оставшуюся часть строки.
system("bash -c \"diff <(cat /etc/passwd) <(ls -l /etc)\"");