我正在尝试从我的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)
我可以创建一个文件并运行它,但我将其留作最后一个选项。
答案 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)\"");