%20e%2C%20em%20caso%20afirmativo%2C%20qual%20%C3%A9%3F.png)
Existe um limite máximo para a expansão do nome do arquivo (globbing) e, em caso afirmativo, qual é? Verglobulandoem tldp.org.
Digamos que eu queira executar um comando em um subconjunto de arquivos:
grep -e bar foo*
rm -f bar*
Existe um limite para quantos arquivos o bash será expandido e, em caso afirmativo, qual é?
Não estou procurando formas alternativas de realizar essas operações (por exemplo, usando find
).
Responder1
Não há limite (além da memória disponível) para o número de arquivos que podem ser expandidos por um bash
glob.
No entanto, quando esses arquivos são passados como argumentos para um comando que éexecutado(em oposição a um shell interno ou função), então você pode atingir um limite de execve()
chamadas do sistema em alguns sistemas. Na maioria dos sistemas, essa chamada de sistema tem um limite no tamanho cumulativo dos argumentos e do ambiente passados para ela, e no Linux também um limite separado no tamanho de um único argumento.
Para mais detalhes, consulte:
- O que define o tamanho máximo para um único argumento de comando?
- CP: argumentos de número máximo de arquivos de origem para utilitário de cópia
Para contornar esse limite, você pode usar (assumindo GNU xargs
ou compatível):
printf '%s\0' foo* | xargs -r0 rm -f
Acima, como printf
está integrado (na bash
maioria dos shells do tipo Bourne), não atingimos o execve()
limite. E xargs
dividirá a lista de argumentos em quantas rm
invocações forem necessárias para evitar a execve()
limitação.
Com zsh
:
autoload zargs
zargs foo* -- rm -f
Com ksh93
:
command -x rm -f foo*
Responder2
Você pode ver o limite para o tamanho total dos argumentos com:
getconf ARG_MAX
Isso geralmente é determinado não pelo shell, mas pelo sistema operacional subjacente de acordo comesta resposta.