system(" command")产生错误;但它直接从Bash提示调用时有效

时间:2017-10-23 10:26:16

标签: c++ linux bash

我正在尝试从我的C ++程序运行以下bash命令:

diff <(cat /etc/passwd) <(ls -l /etc)

使用以下C ++语句:

system("diff <(cat /etc/passwd) <(ls -l /etc)");

直接从Linux shell运行它时该命令工作正常,但是从我的程序运行它时,我得到:

sh: 1: Syntax error: "(" unexpected

指的是(

我尝试使用(转义\,但这会产生更多问题:

system("diff <\\(cat /etc/passwd\\) <\\(ls -l /etc\\)");

sh: 1: cannot open (cat: No such file

我想要的只是从我的C ++程序中运行以下命令:

diff <(cat /etc/passwd) <(ls -l /etc)

我可以创建一个文件并运行它,但我将其留作最后一个选项。

2 个答案:

答案 0 :(得分:20)

如上所述system()创建一个新的标准shell 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");

以下是order the documents in your query来电手册页的相关部分:

  

system()库函数使用fork(2)创建子进程    使用execl(3)执行命令中指定的shell命令    如下:

 execl("/bin/sh", "sh", "-c", command, (char *) 0);
     命令完成后

system()返回。

答案 1 :(得分:7)

system(3)调用调用/bin/sh来处理命令。如果要特别使用bash功能,则需要在命令字符串前插入bash -c,命令字符串将运行bash并告诉它处理字符串的其余部分。

system("bash -c \"diff <(cat /etc/passwd) <(ls -l /etc)\"");