C system()调用参数扩展

时间:2014-04-06 15:20:22

标签: c bash

我正在尝试使用C system()调用合并一组文件:

int main(int argc, char* argv[]) {
  return system("cat output{1,2} > merged.out");
}

结果是:

$ gcc test.c
$ ./a.out
cat: output{1,2}: No such file or directory

如果我直接在bash中执行它,它会起作用:

$ ls output{1,2}
output1  output2
$ cat output{1,2}
1,2
3,4

如何在system()来电中启用参数扩展?

3 个答案:

答案 0 :(得分:2)

原因是system使用/bin/sh,但不会扩展大括号。例如,尝试:

/bin/sh -c 'echo cat output{1,2}'

并比较

/bin/bash -c 'echo cat output{1,2}'

如果必须,请

system("/bin/bash -c 'cat output{1,2} > merged.out'");

但为什么不简单地读取这两个文件并将输出写入merged.out

答案 1 :(得分:1)

system将命令传递给/bin/sh -c。如果参数扩展无法按预期工作,/bin/sh未与系统上的/bin/bash相关联。您可以使用以下方法明确地启动bash shell:

return system("bash -c \"cat output{1,2} > merged.out\"");

答案 2 :(得分:1)

扩张是一项责任。像`system(" / usr / bin / bash -c \" cat output {1,2} \"> merged.out");"应该工作。