6

argv変数を反復処理することでコマンドラインを表示するCプログラムがあります。

#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

ただし、同じフォルダー内のglobを使用して呼び出された場合、プログラムは問題なく動作しlsます。プログラムを呼び出すときに失敗するのはなぜですか?ワイルドカードを拡張するにはどうすればよいですか?grep**/*.hzshzsh

編集:私はcygwinでzshを使用しています。

4

2 に答える 2

7

実行しようとしたアプリケーションは、Windows アプリ (mingw を含む) または Cygwin アプリですか?

ARG_MAXは、コマンド ラインの長さを定義します。通常、これは OS によって設定され、すべてのアプリケーションがそれに制限されますが、Cygwin 用にコンパイルされた Cygwin アプリケーションでは、Windows アプリよりも大きなバッファーを使用できます。議論の例については、このメッセージを参照してください。

すべてのファイルを同時に arg として必ずしも必要としない場合は、xargs を使用してファイル名を ARG_MAX に収まるブロックに分割できます。

echo **/*.h | xargs ./a.out
于 2009-11-08T21:43:29.487 に答える
2

コードをコンパイルし、同様の方法で現在のディレクトリで実行したところ、エラー メッセージが表示されずに正常に動作しました。また、「引数リストが長すぎます」というエラーメッセージがzshのソースコードに存在しないため、実際にはOSの問題である可能性があることを示唆する誰かが投稿したこのメッセージに出くわしました: http://www.zsh.org/mla/workers /1996/msg00060.html

于 2009-10-01T00:47:14.610 に答える