Существует ли максимум для расширения имени файла (глобация), и если да, то что это?

11

Существует ли максимум для расширения имени файла (глобация), и если да, то что это? См подстановка на tldp.org.

Допустим, я хочу запустить команду для подмножества файлов:

grep -e bar foo*
rm -f bar*

Существует ли ограничение на количество файлов, на которые распространяется bash, и если да, то что это?

Я не ищу альтернативных способов выполнения этих операций (например, с помощью find).

Томас
источник
2
Смотрите также: Что определяет максимальный размер одного аргумента команды? В современных системах Linux существуют разные ограничения для размера одного аргумента и для общего размера. Последнее зависит от предела размера стека.
ilkkachu

Ответы:

17

Нет ограничений (кроме доступной памяти) на количество файлов, которые могут быть расширены bashглобусом.

Однако , когда эти файлы передаются в качестве аргументов команды, которая выполнена (в отличие от оболочки или встроенной команды функции), то вы можете столкнуться с пределом execve()системного вызова на некоторых системах. В большинстве систем этот системный вызов имеет ограничение на совокупный размер аргументов и передаваемой ему среды, а в Linux также отдельное ограничение на размер одного аргумента.

Для более подробной информации смотрите:

Чтобы обойти это ограничение, вы можете использовать (при условии, что GNU xargsили совместимый):

printf '%s\0' foo* | xargs -r0 rm -f

Выше, поскольку printfон встроен ( bashи в большинство оболочек типа Борна), мы не достигли execve()предела. И xargsразделит список аргументов на столько rmвызовов, сколько необходимо, чтобы избежать execve()ограничения.

С zsh:

autoload zargs
zargs foo* -- rm -f

С ksh93:

command -x rm -f foo*
Стефан Шазелас
источник
7

Вы можете увидеть ограничение на общий размер аргументов с помощью:

getconf ARG_MAX

Как правило, это определяется не оболочкой, а операционной системой в соответствии с этим ответом .

DopeGhoti
источник
2
Я думаю, что это общая длина, а не число?
ilkkachu
1
Вы, конечно, правы; Я обновил свой ответ, чтобы отразить это. Из-за этого ограничение на число аргументов будет функцией длины аргументов.
DopeGhoti