%20y%2C%20de%20ser%20as%C3%AD%2C%20cu%C3%A1l%20es%3F.png)
¿Existe un máximo para la expansión del nombre del archivo bash (globbing) y, de ser así, cuál es? Vergloboen tldp.org.
Digamos que quiero ejecutar un comando en un subconjunto de archivos:
grep -e bar foo*
rm -f bar*
¿Existe un límite en cuanto a la cantidad de archivos a los que se expandirá bash y, de ser así, cuál es?
No estoy buscando formas alternativas de realizar esas operaciones (por ejemplo, mediante el uso find
).
Respuesta1
No hay límite (aparte de la memoria disponible) para la cantidad de archivos que un bash
globo puede expandir.
Sin embargo, cuando esos archivos se pasan como argumentos a un comando que esejecutado(a diferencia de una función o función incorporada del shell), es posible que se encuentre con un límite de execve()
llamada al sistema en algunos sistemas. En la mayoría de los sistemas, esa llamada al sistema tiene un límite en el tamaño acumulativo de los argumentos y el entorno que se le pasa, y en Linux también un límite separado en el tamaño de un solo argumento.
Para obtener más detalles, consulte:
- ¿Qué define el tamaño máximo para un argumento único de comando?
- CP: número máximo de argumentos de archivos fuente para la utilidad de copia
Para evitar ese límite, puede usar (asumiendo GNU xargs
o compatible):
printf '%s\0' foo* | xargs -r0 rm -f
Arriba, dado que printf
está integrado (en bash
la mayoría de los shells tipo Bourne), no llegamos al execve()
límite. Y xargs
dividirá la lista de argumentos en tantas rm
invocaciones como sea necesario para evitar la execve()
limitación.
Con zsh
:
autoload zargs
zargs foo* -- rm -f
Con ksh93
:
command -x rm -f foo*
Respuesta2
Puedes ver el límite para el tamaño total de los argumentos con:
getconf ARG_MAX
Esto generalmente no está determinado por el shell, sino por el sistema operativo subyacente de acuerdo conesta respuesta.