我有这个非常简单的C程序:怪异的行为时,*作为命令行参数在Linux上
#include <stdio.h>
int main (int argc, char ** argv){
printf ("%s\n",argv[1]);
}
在Linux上运行它/ bash的,像这样:
./a.out *
我得到的以下输出:
a.c
为什么?
我有这个非常简单的C程序:怪异的行为时,*作为命令行参数在Linux上
#include <stdio.h>
int main (int argc, char ** argv){
printf ("%s\n",argv[1]);
}
在Linux上运行它/ bash的,像这样:
./a.out *
我得到的以下输出:
a.c
为什么?
我不知道,但运行具有水珠字符命令行时,如*或?,命令行解释器首先扩展字符,然后才运行该程序。
例如,如果你的程序是:
#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
当然,输出将取决于当前目录的内容。
因为*
是一个glob字符,它扩展为当前目录中的文件列表。
如果您想通过文字*
你将需要引用或逃避它:
./a.out '*'
在这种情况下,OP可能将其源文件与编译的可执行文件放在同一目录中。我希望更多的业余程序员知道这个功能......确保你自己处理通配符。 – SevenBits
这个问题似乎是无关紧要的,因为它涉及到shell的使用。 – 2014-02-06 20:33:43
@ H2CO3:分类。如果Yigal用于Windows/DOS,那么shell不会解释任何内容,*会传递给需要链接库或句柄*的程序。 –
不要低估这个问题。我在一段时间里没有ROFL这么辛苦 - 它具有一些严肃的娱乐价值。 :D – PSkocik