Системная функция C вызывает ошибку «sh: синтаксическая ошибка:» («неожиданно» - PullRequest
0 голосов
/ 02 ноября 2010

Я написал простую программу на C для Linux, чтобы удалить все файлы в каталоге, кроме одного с именем svn, например:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     system("rm !(svn)");
  6     return 0;
  7 }

Но когда я компилирую и запускаю его, терминал говорит:sh: Syntax error: "(" unexpected

Однако, когда я набираю и запускаю команду непосредственно в терминале, все делается правильно.Есть идеи?

Ответы [ 5 ]

4 голосов
/ 02 ноября 2010

Вам, вероятно, понадобится использовать это:

system("/bin/bash -c 'rm !(svn)'")

или, возможно:

system("/bin/bash -O extglob -c 'rm !(svn)'")

или:

system("find . -maxdepth 1 ! -name 'svn' -delete")

или подобное.1011 * Но, вероятно, лучше использовать JeremyP's answer .

4 голосов
/ 02 ноября 2010

Ответ не использовать system. Используйте системные вызовы Linux для вывода списка файлов в каталоге и удаления их с помощью unlink (). Что-то вроде:

DIR* dirHandle = opendir(dirName);
struct dirent* dirEntry;
while ((dirEntry = readdir(dirHandle)) != NULL)
{
    if (strcmp(dirEntry->d_name, "svn") != 0)
    {
        unlink(dirEntry->d_name);
    }
}

Предупреждение: вся обработка ошибок пропущена, не скомпилирована и не протестирована, readdir может вернуть . и .., которые также необходимо удалить.

2 голосов
/ 02 ноября 2010

Вы должны использовать sh синтаксис оболочки, вы этого не делаете.

0 голосов
/ 02 ноября 2010

Обходной путь: Переместить файл за пределы каталога (например, в / tmp или ..), удалить все, переместить его обратно (сделать это с помощью нескольких системных вызовов).

Другой подход:

find . -prune ! -name svn | xargs /bin/rm -f
0 голосов
/ 02 ноября 2010

Думаю, я бы просто добавил оболочку к системной команде:

system("/bin/csh rm !(svn)");

или какую бы оболочку вы не использовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...