2009-08-05 50 views
5

我有一個C程序,通過遍歷argv變量來顯示它的命令行。zsh如何擴展球體?

#include <stdio.h> 

int main(int argc, char *argv[]){ 
    int i = 0; 
    printf("----------\n"); 
    for(i = 0; i < argc; i++) 
     printf("%s\n", argv[i]); 
    return 0; 
} 

我的文件夾中調用的程序包含有大量C++源樹是這樣的:

./a.out **/*.h 

輸出:

zsh: argument list too long: ./a.out 

然而,像lsgrep工作方案,沒有任何在同一文件夾中使用**/*.h glob調用時出現問題。爲什麼zsh在調用我的程序時失敗? zsh如何去擴展通配符?

編輯:我在cygwin上使用zsh。

+0

爲何使用雙「*」代替單一的'*'在你的命令行? – 2012-08-17 05:24:14

回答

5

是您試圖運行的應用程序Windows應用程序(包括mingw)或Cygwin應用程序?

ARG_MAX定義了命令行的長度。通常它由操作系統設置,並且所有應用程序都受限於此,但爲Cygwin編譯的Cygwin應用程序可以使用比Windows應用程序更大的緩衝區 - 有關示例討論,請參閱this message

如果你並不一定需要所有的文件,同時指定參數時,您可以使用xargs的分區,適合在ARG_MAX文件名來塊:

echo **/*.h | xargs ./a.out 
+0

是的,這是一個在Cygwin上運行的Windows可執行文件。 – 2009-11-09 04:48:54

2

我編譯了你的代碼,並以類似的方式在當前目錄中執行它,並且它沒有任何錯誤消息就能正常工作。此外,我發現這個消息,由某人建議,錯誤消息「參數列表太長」不存在於zsh的源代碼中,因此可能實際上是一個操作系統問題:http://www.zsh.org/mla/workers/1996/msg00060.html