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

mar*_*rko 13 c++ linux bash

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

diff <(cat /etc/passwd) <(ls -l /etc)
Run Code Online (Sandbox Code Playgroud)

使用以下C++语句:

system("diff <(cat /etc/passwd) <(ls -l /etc)");
Run Code Online (Sandbox Code Playgroud)

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

sh: 1: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

那指的是 (

我试过逃避(a \,但这会产生更多问题:

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

sh: 1: cannot open (cat: No such file
Run Code Online (Sandbox Code Playgroud)

我想要的是从我的C++程序运行以下内容:

diff <(cat /etc/passwd) <(ls -l /etc)
Run Code Online (Sandbox Code Playgroud)

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

use*_*042 21

如上所述,system()创建一个新的标准shell sh并执行命令.由于<()是bash特定功能,因此无法解释sh.

您可以通过bash显式调用来避免这种情况,并使用以下-c选项:

system("bash -c \"diff <(cat /etc/passwd) <(ls -l /etc)\"");
Run Code Online (Sandbox Code Playgroud)

或使用原始字符串文字:

system(R"cmd(bash -c "diff <(cat /etc/passwd) <(ls -l /etc)")cmd");
Run Code Online (Sandbox Code Playgroud)

以下是system(3)呼叫手册页的相关部分:

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

 execl("/bin/sh", "sh", "-c", command, (char *) 0);
Run Code Online (Sandbox Code Playgroud)

system() 命令完成后返回.


gav*_*inb 7

system(3)调用调用/bin/sh以处理该命令.如果您想要专门使用bash功能,则需要bash -c在命令字符串前面插入,该字符串将运行bash并告诉它处理字符串的其余部分.

system("bash -c \"diff <(cat /etc/passwd) <(ls -l /etc)\"");
Run Code Online (Sandbox Code Playgroud)

  • 如果没有在接受的答案中看到内部引用,这将无效. (3认同)