Подтвердить что ты не робот

Система ( "команда" ) создает ошибку; но он работает при вызове непосредственно из приглашения 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)

Я могу создать файл и запустить его, но я оставляю это как последний вариант.

4b9b3361

Ответ 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)\"");