【问题标题】:C system function causes error 'sh: Syntax error: "(" unexpected 'C系统函数导致错误'sh:语法错误:“(”意外'
【发布时间】:2011-05-03 21:29:34
【问题描述】:

我在 Linux 上用 C 语言编写了一个简单的程序来删除目录中的所有文件,除了一个名为 svn 的文件,如下所示:

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

但是当我编译运行它时,终端显示:sh: Syntax error: "(" unexpected

但是,当我直接在终端中键入并运行命令时,所有事情都正确完成。 有什么想法吗?

【问题讨论】:

  • 您使用的是哪个外壳? shbash 不支持这种语法。
  • 我想我正在使用 bash。如何在 sh shell 语法中做我想做的事?
  • @adamk:Bash 通过 shopt -s extglob 选项支持这一点。

标签: c linux shell system


【解决方案1】:

答案是不要使用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 可能返回...,也不需要删除。

【讨论】:

  • @wong2:有很多与system 相关的问题,其中一个您已经遇到过。我真的不会考虑将它用于任何生产质量代码。
【解决方案2】:

你可能需要使用这个:

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

或者可能:

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

或:

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

或类似的。

但使用JeremyP's answer 可能会更好。

【讨论】:

    【解决方案3】:

    解决方法:将文件移出目录(例如在 /tmp 或 .. 中),全部删除,然后移回(使用多个 system() 调用来完成)。

    另一种方法:

    find . -prune ! -name svn | xargs /bin/rm -f
    

    【讨论】:

      【解决方案4】:

      我想我只是将 shell 添加到系统命令中:

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

      或您使用的任何外壳。

      【讨论】:

        【解决方案5】:

        你必须使用sh shell 语法,你没有这样做。

        【讨论】:

        • 谢谢!那么如何在 sh shell 语法中做我想做的事呢?
        猜你喜欢
        • 2016-05-30
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        相关资源
        最近更新 更多