Ok, mieszkańcy. Tak więc od dłuższego czasu akceptuję ograniczenia długości wiersza poleceń jako gospel. Co więc zrobić ze swoimi założeniami? Oczywiście - sprawdź je.
Mam do dyspozycji maszynę Fedora 22 (czyli: Linux z bash4). Utworzyłem katalog zawierający 500 000 i-węzłów (plików), każdy o długości 18 znaków. Długość wiersza poleceń wynosi 9500000 znaków. Utworzono w ten sposób:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
I zauważamy:
$ getconf ARG_MAX
2097152
Pamiętaj jednak, że mogę to zrobić:
$ echo * > /dev/null
Ale to się nie udaje:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Mogę uruchomić pętlę for:
$ for f in *; do :; done
czyli kolejna wbudowana powłoka.
Uważne czytanie dokumentacjiARG_MAX
stanów. Maksymalna długość argumentów funkcji exec . To znaczy: bez dzwonienia exec
nie ma ARG_MAX
ograniczeń. To wyjaśniałoby, dlaczego polecenia wbudowane powłoki nie są ograniczone przez ARG_MAX
.
I rzeczywiście, mogę ls
mój katalog, jeśli moja lista argumentów ma 109948 plików lub około 2089000 znaków (daj lub weź). Jednak gdy dodam jeszcze jeden 18-znakowy plik nazwy pliku, pojawia się zbyt długi błąd listy argumentów . Tak więc ARG_MAX
działa zgodnie z zapowiedzią: wykonanie kończy się niepowodzeniem z więcej niż ARG_MAX
znakami na liście argumentów - w tym, należy zauważyć, danymi środowiska.