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

时间:2015-07-12 14:54:00

标签: c grep

考虑以下两个文本文件:

def.txt

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

def.dat

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

以上2个文件存储在examples目录中。

以下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;
}

上述程序的输出为256

1 个答案:

答案 0 :(得分:2)

/bin/sh不是bash。 /bin/sh不支持大括号扩展。尝试通过/bin/sh手动运行该命令,它也不会工作。

您的选择是手动写出命令(自己做大括号扩展)或将命令包装在/bin/bash -c '......'中并确保您提供足够的报价转义以保持您所需的命令保持原样(是复杂而丑陋的。)

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