forループで「引数が長すぎます」エラーが発生しないのはなぜですか?

forループで「引数が長すぎます」エラーが発生しないのはなぜですか?

この場合、「パラメータが多すぎる」エラーが発生することがわかりました。

ls *.*

これは改善されません。

for file in *.*
do
    echo $file
done

なぜ?

答え1

「パラメータが長すぎます」というエラーは、E2BIG次のために発生します。execve引数(一部のシステムの環境を含む)の合計サイズが大きすぎる場合のシステム呼び出し。このexecve呼び出しは外部プロセスを開始する呼び出しで、特に別の実行可能ファイルをロードします(別の呼び出しがあります)。fork、コードがまだ同じ実行ファイルから出てくる別のプロセスを実行している場合)。ループforは内部シェル構成なので、呼び出しは含まれません。 globが展開されたときにエラーが発生するのではなく、execveコマンドが呼び出されたときにエラーが発生します。ls *.*ls

execveE2BIGコマンドパラメータの合計サイズが次より大きい場合ARG_MAX 限界。コマンドを使用して、システムでこの制限値を表示できますgetconf ARG_MAX。 (メモリが十分であれば、この制限を超える可能性があります。関連のないエラーが発生しない限り、動作は保証さARG_MAXれます。)execve

答え2

最初の例では/ pairシステムコールを介して行われているlsようですが、2番目の例ではすべての操作が 。bashforkexecbash

呼び出しにはexec制限がありますが、Pythonの内部動作に制限はありません(またはより良い方法は、bash利用可能なメモリ量に関連しない他の制限があります)。exec

答え3

これはlsパラメータであり、パラメータの数が制限されているためです。

ループの場合はforアイテムのリストにすぎません。 (私が知る限り)これに制限はありません。

関連情報