LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 999|回复: 4

我发现的一个关于在程序中调用 zip 时参数传递的问题

[复制链接]
发表于 2005-9-9 16:43:11 | 显示全部楼层 |阅读模式
先看一下下面的代码:
#include <unistd.h>
#include <stdio.h>

int main(void) {

  int pid;
  char *tzip[6] = {"zip", "-9r", "ch.zip", "*.[ch]", NULL};

  /* zip */
  printf("\ncommand line: %s %s %s %s\n\n",
            tzip[0], tzip[1], tzip[2], tzip[3]);
  pid =    execvp(tzip[0], tzip);
  perror("execvp: tzip");
  return 0;
} /* main */

这个程序的功能是把当前工作目录中的以.c和.h做扩展名的文件压缩到ch.zip文件中,但是它不能正常工作。编译并运行这个程序,给出下面的提示:

command line: zip -9r ch.zip *.[ch]

        zip warning: name not matched: *.[ch]

zip error: Nothing to do! (try: zip -9r ch.zip . -i *.[ch])
这个错误出在 zip 不能正确解析 *.[ch] 这个带有通配符的参数上。在程序输出里面给出了一个命令行:
    zip -9r ch.zip *.[ch]
如果我直接在 bash 的提示符下输入上面的这个命令行,zip 是可以正确解析 *.[ch]的,可以得到 ch.zip 这个压缩包。

经过测试发现,在程序中调用 zip 时出现的错误,和在bash提示符下输入这样的命令行出现的错误是一样的:
        zip -9r ch.zip "*.[ch]"
这个命令行也给出下面这样的提示:

       zip warning: name not matched: *.[ch]

zip error: Nothing to do! (try: zip -9r ch.zip . -i *.[ch])

小弟实在是不明白怎么回事,也不知道该怎么做才能解决这个问题,望高手赐教!
发表于 2005-9-9 20:19:03 | 显示全部楼层
我发现system是可以的,就是这样:system("zip -9r ch.zip *.[ch]");
看了一下system的实现,她是这样调用execve的:

  1. char *tzip[3] = {"/bin/sh","-c","zip -9r ch.zip *.[ch]", NULL};
  2. execve(tzip[0],tzip,0);
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-9-9 22:10:16 | 显示全部楼层
正则表达式是shell帮助解释的,不是zip自己解释的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-10 08:10:27 | 显示全部楼层
原来是这样,zip 不是自己解析通配符。find 是自己解析的。
回复 支持 反对

使用道具 举报

发表于 2005-9-10 08:31:01 | 显示全部楼层
Post by netjune
正则表达式是shell帮助解释的,不是zip自己解释的

原来如此~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表