В основному це залежить від вашої версії ядра Linux.
Ви повинні мати можливість бачити ліміт для вашої системи, запустивши
getconf ARG_MAX
який повідомляє вам про максимальну кількість байтів, які може мати командний рядок після розширення оболонкою.
У Linux <2.6.23 ліміт зазвичай становить 128 КБ.
В Linux> = 2.6.25 ліміт становить або 128 КБ, або 1/4 розміру вашої стеки (див. ulimit -s
), Залежно від того, що більше.
Детальну інформацію див. На головній сторінці execve (2) .
На жаль, трубопровід ls *.txt
не вирішить проблему, оскільки ліміт знаходиться в операційній системі, а не в оболонці.
Оболонка розгортає *.txt
, потім намагається викликати
exec("ls", "a.txt", "b.txt", ...)
і у вас стільки файлів, що відповідають, *.txt
що ви перевищуєте ліміт 128 КБ.
Вам доведеться зробити щось на кшталт
find . -maxdepth 1 -name "*.txt" | wc -l
замість цього.
(І дивіться коментарі Шона Дж. Гоффа нижче щодо імен файлів, що містять нові рядки.)
ls
результатів , що є поганою ідеєю, тому краще уникати цього. Для підрахунку див. Який найкращий спосіб підрахувати кількість файлів у каталозі? , для хитрого вирішення питання, чому для циклу не виникає помилка "занадто довгий аргумент"? .