%20%D0%B8%20%D0%B5%D1%81%D0%BB%D0%B8%20%D0%B4%D0%B0%2C%20%D1%82%D0%BE%20%D0%BA%D0%B0%D0%BA%D0%BE%D0%B9%20%D0%BE%D0%BD%3F.png)
Существует ли максимальный предел расширения имени файла в bash (globbling) и если да, то какой он? См.подстановкана tldp.org.
Допустим, я хочу выполнить команду для подмножества файлов:
grep -e bar foo*
rm -f bar*
Существует ли ограничение на количество файлов, на которые может расшириться bash, и если да, то каково оно?
Я не ищу альтернативные способы выполнения этих операций (например, с помощью find
).
решение1
Ограничений (кроме доступной памяти) на количество файлов, которые могут быть расширены с помощью глобуса, нет bash
.
Однако когда эти файлы передаются в качестве аргументов команде, котораяказнен(в отличие от встроенной функции оболочки), то вы можете столкнуться с ограничением системного execve()
вызова в некоторых системах. В большинстве систем этот системный вызов имеет ограничение на совокупный размер переданных ему аргументов и окружения, а в Linux также отдельное ограничение на размер одного аргумента.
Более подробную информацию см. здесь:
- Что определяет максимальный размер одного аргумента команды?
- CP: максимальное количество исходных файлов аргументов для утилиты копирования
Чтобы обойти это ограничение, можно использовать (предполагается, что GNU xargs
или совместимое):
printf '%s\0' foo* | xargs -r0 rm -f
Выше, поскольку printf
встроено (в bash
большинстве оболочек типа Bourne), мы не достигаем предела execve()
. И xargs
разделим список аргументов на столько rm
вызовов, сколько необходимо, чтобы избежать execve()
ограничения.
С zsh
:
autoload zargs
zargs foo* -- rm -f
С ksh93
:
command -x rm -f foo*
решение2
Ограничение на общий размер аргументов можно увидеть с помощью:
getconf ARG_MAX
Это определяется, как правило, не оболочкой, а базовой операционной системой в соответствии сэтот ответ.