Esiste un massimo per colpire l'espansione del nome del file (globbing) e, in caso affermativo, che cos'è?


11

Esiste un massimo per colpire l'espansione del nome del file (globbing) e, in caso affermativo, che cos'è? Vedere globbing su tldp.org.

Diciamo che voglio eseguire un comando su un sottoinsieme di file:

grep -e bar foo*
rm -f bar*

Esiste un limite al numero di file a cui bash si espanderà e, in caso affermativo, di cosa si tratta?

Non sto cercando modi alternativi per eseguire tali operazioni (ad esempio utilizzando find).



2
Vedi anche: Cosa definisce la dimensione massima per un singolo argomento di comando? Sui sistemi Linux attuali, esistono limiti diversi per la dimensione di un singolo argomento e per la dimensione totale. Quest'ultimo dipende dal limite delle dimensioni dello stack.
ilkkachu,

Risposte:


17

Non esiste alcun limite (diverso dalla memoria disponibile) per il numero di file che possono essere espansi da un bashglob.

Tuttavia, quando quei file vengono passati come argomenti a un comando che viene eseguito (al contrario di una shell incorporata o di una funzione), è possibile imbattersi in un limite della execve()chiamata di sistema su alcuni sistemi. Sulla maggior parte dei sistemi, quella chiamata di sistema ha un limite sulla dimensione cumulativa degli argomenti e dell'ambiente passati ad essa, e su Linux anche un limite separato sulla dimensione di un singolo argomento.

Per maggiori dettagli, vedi:

Per aggirare quel limite, puoi usare (supponendo GNU xargso compatibile):

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

Sopra, dato che printfè incorporato (nelle bashe più shell tipo Bourne), non raggiungiamo il execve()limite. E xargsdividerà l'elenco degli argomenti in tutte le rminvocazioni necessarie per evitare la execve()limitazione.

Con zsh:

autoload zargs
zargs foo* -- rm -f

Con ksh93:

command -x rm -f foo*

7

Puoi vedere il limite per la dimensione totale degli argomenti con:

getconf ARG_MAX

Questo è determinato generalmente non dalla shell, ma dal sistema operativo sottostante in base a questa risposta .


2
Penso che sia la lunghezza totale, non il numero?
ilkkachu,

1
Naturalmente hai ragione; Ho aggiornato la mia risposta per riflettere questo. Per questo motivo, il limite al numero di argomenti sarà una funzione della lunghezza degli argomenti.
DopeGhoti,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.