Czy istnieje maksymalne rozszerzenie nazwy pliku bash (globbing), a jeśli tak, to co to jest?

11

Czy istnieje maksymalne rozszerzenie nazwy pliku bash (globbing), a jeśli tak, to co to jest? Zobacz globbing na tldp.org.

Powiedzmy, że chcę uruchomić polecenie dla podzbioru plików:

grep -e bar foo*
rm -f bar*

Czy istnieje ograniczenie liczby rozwijanych plików bash, a jeśli tak, to co to jest?

Nie szukam alternatywnych sposobów wykonywania tych operacji (np. Przy użyciu find).

Tomasz
źródło
2
Zobacz także: Co określa maksymalny rozmiar pojedynczego argumentu polecenia? W obecnych systemach Linux istnieją różne limity wielkości pojedynczego argumentu i wielkości całkowitej. To ostatnie zależy od limitu wielkości stosu.
ilkkachu

Odpowiedzi:

17

Nie ma ograniczenia (poza dostępną pamięcią) liczby plików, które mogą być rozszerzane przez bashglob.

Jednak gdy pliki te są przekazywane jako argumenty do komendy, która jest wykonywana (w przeciwieństwie do wbudowanej powłoki lub funkcji), możesz napotkać limit execve()wywołania systemowego w niektórych systemach. W większości systemów to wywołanie systemowe ma limit łącznej wielkości argumentów i przekazywanego mu środowiska, a w Linuksie także oddzielny limit wielkości pojedynczych argumentów.

Aby uzyskać więcej informacji, zobacz:

Aby obejść ten limit, możesz użyć (zakładając GNU xargslub zgodny):

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

Powyżej, ponieważ printfjest wbudowany (w bashi większość powłok podobnych do Bourne'a), nie osiągamy execve()limitu. I xargspodzieli listę argumentów na tyle rminwokacji, ile potrzeba, aby uniknąć execve()ograniczenia.

Z zsh:

autoload zargs
zargs foo* -- rm -f

Z ksh93:

command -x rm -f foo*
Stéphane Chazelas
źródło
7

Możesz zobaczyć limit całkowitej wielkości argumentów za pomocą:

getconf ARG_MAX

Zasadniczo jest to określane nie przez powłokę, ale przez podstawowy system operacyjny zgodnie z tą odpowiedzią .

DopeGhoti
źródło
2
Myślę, że to całkowita długość, a nie liczba?
ilkkachu
1
Masz oczywiście rację; Zaktualizowałem swoją odpowiedź, aby to odzwierciedlić. Z tego powodu ograniczenie liczby argumentów będzie funkcją długości argumentów.
DopeGhoti