2014-02-06 34 views
0

我有这个非常简单的C程序:怪异的行为时,*作为命令行参数在Linux上

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

在Linux上运行它/ bash的,像这样:

./a.out * 

我得到的以下输出:

a.c 

为什么?

+5

这个问题似乎是无关紧要的,因为它涉及到shell的使用。 – 2014-02-06 20:33:43

+1

@ H2CO3:分类。如果Yigal用于Windows/DOS,那么shell不会解释任何内容,*会传递给需要链接库或句柄*的程序。 –

+2

不要低估这个问题。我在一段时间里没有ROFL这么辛苦 - 它具有一些严肃的娱乐价值。 :D – PSkocik

回答

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 

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

6

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

如果您想通过文字*你将需要引用或逃避它:

./a.out '*' 
+0

在这种情况下,OP可能将其源文件与编译的可执行文件放在同一目录中。我希望更多的业余程序员知道这个功能......确保你自己处理通配符。 – SevenBits