【问题标题】:system() returns error syntax error: "(" unexpectedsystem() 返回错误语法错误:“(”意外
【发布时间】:2018-01-03 11:51:08
【问题描述】:

我想在我的 C++ 代码中使用一个使用 system() API 的命令。

命令是:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

有关该命令的更多详细信息,请使用this link

当我在 Ubuntu 64 位机器上使用终端时,此命令完美运行,但是当我在 C++ 代码中的 system("above command") API 中使用时,它显示错误,它们在下面:

sh: 1: 语法错误:"(" 意外

我在 Google 上搜索并找到一个解决方案 (C system function causes error 'sh: Syntax error: “(” unexpected '),但接受的解决方案以另一种方式完成任务。这不是一个解决方案,其他解决方案也不起作用。

每个人都解释了如何在 shell 脚本(.sh 文件)中删除此错误,因为所有解决方案都可能适用于 .sh,但它们不适用于 system() API。我无法在 C++ 代码 system() API 中找到如何消除此错误。

【问题讨论】:

  • 如果您明确尝试使用该命令运行bash 会怎样?命令sh 可能不是 Bash,或者可能是没有 Bash 扩展的 Bash?
  • 从我看到你的命令使用进程替换语法comm &lt;(),这是bash的一个特性,而不是sh
  • @Someprogrammerdude 我在 ubuntu 中打开终端并运行“comm -23
  • 同样sh 不是bash。而bash 不是sh。 shell sh 可能是一个最小的 shell,它甚至可能不支持所有 POSIX 功能。 bash shell 是一个非常大且复杂的 shell,带有许多非标准扩展。如果你依赖这些扩展(我猜&lt;(...) 是),那么你就不能使用普通的shell sh。要么你必须修改命令,使sh 可以运行它,或者显式使用bash(如bash -c "..."
  • 另请注意,拥有system("sudo ...") 是一个像谷仓一侧一样大的安全性,只是等待发生。

标签: c++ linux bash shell system


【解决方案1】:

如前所述,&lt;(...) 的进程替换是 Bash 的一项功能,在 vanilla sh 中不可用。因此,您需要显式调用 Bash shell:

bash -c "comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)"

【讨论】:

    【解决方案2】:

    试试吧:

    system("bash comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 2023-03-13
      • 2023-02-05
      • 2018-08-03
      • 1970-01-01
      • 2016-08-10
      • 2022-11-21
      • 2016-05-30
      相关资源
      最近更新 更多