この場合、「パラメータが多すぎる」エラーが発生することがわかりました。
ls *.*
これは改善されません。
for file in *.*
do
echo $file
done
なぜ?
答え1
「パラメータが長すぎます」というエラーは、E2BIG
次のために発生します。execve
引数(一部のシステムの環境を含む)の合計サイズが大きすぎる場合のシステム呼び出し。このexecve
呼び出しは外部プロセスを開始する呼び出しで、特に別の実行可能ファイルをロードします(別の呼び出しがあります)。fork
、コードがまだ同じ実行ファイルから出てくる別のプロセスを実行している場合)。ループfor
は内部シェル構成なので、呼び出しは含まれません。 globが展開されたときにエラーが発生するのではなく、execve
コマンドが呼び出されたときにエラーが発生します。ls *.*
ls
execve
E2BIG
コマンドパラメータの合計サイズが次より大きい場合ARG_MAX
限界。コマンドを使用して、システムでこの制限値を表示できますgetconf ARG_MAX
。 (メモリが十分であれば、この制限を超える可能性があります。関連のないエラーが発生しない限り、動作は保証さARG_MAX
れます。)execve
答え2
最初の例では/ pairシステムコールを介して行われているls
ようですが、2番目の例ではすべての操作が 。bash
fork
exec
bash
呼び出しにはexec
制限がありますが、Pythonの内部動作に制限はありません(またはより良い方法は、bash
利用可能なメモリ量に関連しない他の制限があります)。exec
答え3
これはls
パラメータであり、パラメータの数が制限されているためです。
ループの場合はfor
アイテムのリストにすぎません。 (私が知る限り)これに制限はありません。