我有這個非常簡單的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