我试图从我的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)
如下:Run Code Online (Sandbox Code Playgroud)execl("/bin/sh", "sh", "-c", command, (char *) 0);
system()
命令完成后返回.
该system(3)
调用调用/bin/sh
以处理该命令.如果您想要专门使用bash
功能,则需要bash -c
在命令字符串前面插入,该字符串将运行bash
并告诉它处理字符串的其余部分.
system("bash -c \"diff <(cat /etc/passwd) <(ls -l /etc)\"");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1909 次 |
最近记录: |