Гаразд, жителі. Тож я вже досить довго приймаю обмеження довжини командного рядка як євангелію. Отже, що робити з припущеннями? Природно - перевірити їх.
У моєму розпорядженні машина Fedora 22 (мається на увазі: Linux з bash4). Я створив каталог із 500 000 індексів (файлів), кожен із 18 символів. Довжина командного рядка становить 9 500 000 символів. Створений таким чином:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
І ми зазначаємо:
$ getconf ARG_MAX
2097152
Однак зверніть увагу, що я можу зробити це:
$ echo * > /dev/null
Але це не вдається:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Я можу запустити цикл for:
$ for f in *; do :; done
що є ще однією вбудованою оболонкою.
Уважне читання документації щодоARG_MAX
станів, максимальна довжина аргументу для функцій exec . Це означає: Без дзвінка exec
немає ARG_MAX
обмежень. Тож це пояснювало б, чому вбудовані оболонки не обмежені ARG_MAX
.
І справді, я можу ls
створити каталог, якщо мій список аргументів становить 109948 файлів або близько 2089 000 символів (дайте чи візьміть). Однак, як тільки я додаю ще один файл із 18-символьним іменем файлу, тоді з’являється занадто довга помилка списку аргументів . Так ARG_MAX
працює як рекламуються: ехес зазнає невдачі з більш ARG_MAX
символів на аргументі list- в тому числі, слід зазначити, дані навколишнє середовище.