2014-02-06 62 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