grep命令在C程序中的意外行为

grep命令在C程序中的意外行为,c,grep,C,Grep,考虑以下两个文本文件: def.txt simple = "sik", /* fill */ "trauma", /* type */ "hui", /* col */ def.dat simple = "sik", /* fill */ "trauma", /* type */ "hui", /* col */ 上述两个文件存储在示例目录中 以下grep命令正常工作: $ grep --include=*.{txt,dat} -rnw example/ -F -e 'simple' exa

考虑以下两个文本文件:

def.txt

simple =
"sik", /* fill */
"trauma", /* type */
"hui", /* col */
def.dat

simple =
"sik", /* fill */
"trauma", /* type */
"hui", /* col */
上述两个文件存储在
示例
目录中

以下
grep
命令正常工作:

$ grep --include=*.{txt,dat} -rnw example/ -F -e 'simple'
example/def.dat:1:simple =
example/def.txt:1:simple =
$ echo $? => 0
但当我在C程序中执行上述
grep
命令时:

#include <stdio.h>
#include <string.h>

int main (void)
{
  char cmd[1024];

  strcpy (cmd, "grep --include=*.{txt,dat} -rnw example/ -F -e 'simple'");
  printf ("%d\n", system (cmd));
  return 0;
}
#包括
#包括
内部主(空)
{
char cmd[1024];
strcpy(cmd,“grep--include=*.{txt,dat}-rnw-example/-F-e'simple'”;
printf(“%d\n”,系统(cmd));
返回0;
}

上述程序的输出是
256

/bin/sh
不是bash<代码>/bin/sh不支持支架扩展。尝试通过
/bin/sh
手动运行该命令,它也不会工作

您可以选择手动编写命令(自己进行大括号扩展)或将命令包装在
/bin/bash-c'../code>中,并确保提供了足够的引号转义,以保持所需命令的完整性(这既复杂又难看)


另一个选择是根本不这样做。通过使用您执行的脚本(使用适当的shebang行)或(更好地)为您需要解决的任务找到本机解决方案。

/bin/sh
不是bash<代码>/bin/sh
不支持支架扩展。尝试通过
/bin/sh
手动运行该命令,它也不会工作。@EtanReisner这是否意味着没有其他解决方案可以在C中运行该grep命令?这意味着不能在
系统
调用中使用bash特定的功能。因此,要么写出完整的命令(避免大括号扩展),要么在传递给
系统的命令中手动运行
bash
(这意味着小心的额外引用)。@EtanReisner您能告诉我如何在传递给
系统的命令中运行
bash
?这是更糟糕的选择(引用不是微不足道的)但它类似于
/bin/bash-c“your command”
,只是有足够的引号损坏,以使其正确工作(对于任何复杂的命令,都有很多这样的错误)。