在Linux上传递*作为命令行参数时的奇怪行为

时间:2014-02-06 20:31:18

标签: c linux shell command-line-arguments glob

我有这个非常简单的c程序:

#include <stdio.h>
int main (int argc, char ** argv){
  printf ("%s\n",argv[1]);
}

在Linux / bash上运行时如下:

./a.out *

我得到以下输出:

a.c

为什么呢?

2 个答案:

答案 0 :(得分:6)

因为*是一个glob字符,它扩展到当前目录中的文件列表。

如果你想传递文字*,你需要引用或转义它:

./a.out '*'

答案 1 :(得分:2)

我不知道,但是当运行具有全局字符的命令行时,例如*或?,命令行解释器首先展开字符,然后才运行该程序。

例如,如果你的程序是:

#include <stdio.h>
int main (int argc, char ** argv){
  int i;
  printf ("argc=%d\n",argc);
  for (i=0;i<argc;i++){
    printf("%d: %s\n",i,argv[i]);
  }
}

你可以这样运行:

./a.out *

,然后输出将是:

argc=4
0: ./a.out
1: a.c
2: a.c~
3: a.out

当然,输出将取决于当前目录的内容。