Existe um máximo para a expansão do nome de arquivo do bash (globbing) e, em caso afirmativo, o que é?

10

Existe um máximo para expansão de nome de arquivo bash (globbing) e, em caso afirmativo, o que é? Consulte o globbing no 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 expandirá e, em caso afirmativo, o que é isso?

Não estou procurando maneiras alternativas de realizar essas operações (por exemplo, usando find ).

    
por Thomas 06.04.2017 / 17:19

2 respostas

15

Não há limite (além da memória disponível) para o número de arquivos que podem ser expandidos por bash glob.

No entanto, quando esses arquivos são passados como argumentos para um comando que é executado (ao contrário de um shell interno ou função), você pode executar um limite da chamada do sistema execve() alguns sistemas. Na maioria dos sistemas, essa chamada de sistema tem um limite no tamanho cumulativo dos argumentos e do ambiente transmitido a ela e também um limite separado no tamanho de um único argumento.

Para mais detalhes, consulte:

Para contornar esse limite, você pode usar (assumindo o GNU xargs ou compatível):

printf '%s
autoload zargs
zargs foo* -- rm -f
' foo* | xargs -r0 rm -f

Acima, como printf está integrado (em bash e a maioria das camadas semelhantes a Bourne), não atingimos o limite execve() . E o xargs dividirá a lista de argumentos em quantas invocações rm , conforme necessário, para evitar a limitação execve() .

com zsh :

command -x rm -f foo*

com ksh93 :

printf '%s
autoload zargs
zargs foo* -- rm -f
' foo* | xargs -r0 rm -f
    
por 06.04.2017 / 18:40
7

Você pode ver o limite para o tamanho total dos argumentos com:

getconf ARG_MAX

Isso é determinado geralmente não pelo shell, mas pelo sistema operacional subjacente de acordo com esta resposta .

    
por 06.04.2017 / 17:27