Wiersz poleceń Bash i limit wejściowy

Czy istnieje jakiś limit znaków nałożony w bash (lub innych powłokach) na jak długo może być Dane wejściowe? Jeśli tak, to jaki jest limit postaci?

Czyli czy jest możliwe napisanie polecenia w bash, które jest zbyt długie, aby linia komend mogła zostać wykonana? Jeśli nie ma wymaganego limitu, czy istnieje sugerowany limit?

Author: codeforester, 2013-10-14

3 answers

Limit długości wiersza poleceń nie jest narzucany przez powłokę, ale przez system operacyjny. Limit ten zwykle mieści się w zakresie stu kilobajtów. POSIX oznacza ten limit ARG_MAX i w systemach zgodnych z POSIX można go odpytywać za pomocą

$ getconf ARG_MAX    # Get argument limit in bytes

Np. na Cygwinie jest to 32000, a na różnych BSD i Linuksie używam to jest wszędzie od 131072 do 2621440.

Jeśli chcesz przetworzyć listę plików przekraczających ten limit, możesz zajrzeć do xargs narzędzie, które wywołuje program wielokrotnie z podzbiorem argumentów nieprzekraczającym ARG_MAX.

Aby odpowiedzieć na twoje konkretne pytanie, tak, można spróbować uruchomić polecenie ze zbyt długą listą argumentów. Powłoka wyświetli komunikat "lista argumentów za długa".

Zauważ, że wejście do programu (odczytywane na stdin lub innym deskryptorze pliku) jest , a nie ograniczone (tylko przez Dostępne Zasoby programu). Więc jeśli skrypt powłoki wczytuje łańcuch do zmienna, nie jesteś ograniczony przez ARG_MAX.

 88
Author: Jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 10:10:36

Ok, Denizens. Więc zaakceptowałem ograniczenia długości wiersza poleceń jako Ewangelię od dłuższego czasu. Co zrobić z założeniami? Oczywiście-sprawdź je.

Mam do dyspozycji maszynę Fedora 22 (czyli: Linux z bash4). Stworzyłem katalog z 500 000 i-węzłów (plików) w nim każdy po 18 znaków. Długość wiersza poleceń wynosi 9 500 000 znaków. Utworzone 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

Uwaga to:

$ echo * > /dev/null

Ale to się nie uda:

$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long

Mogę uruchomić pętlę for:

$ for f in *; do :; done

Który jest kolejną skorupą zbudowaną.

Uważne przeczytanie dokumentacji dla ARG_MAX Stany, Maksymalna długość argumentu do funkcji exec . Oznacza to: bez wywołania exec, nie ma ARG_MAX ograniczenia. To by wyjaśniało, dlaczego powłoki nie są ograniczone przez ARG_MAX.

I rzeczywiście, mogę ls mój katalog, jeśli moja lista argumentów to 109948 plików długi, czyli około 2 089 000 znaków (mniej więcej). Gdy jednak dodam jeszcze jeden 18-znakowy plik o nazwie pliku, dostaję zbyt długą listę argumentów . Więc ARG_MAX działa zgodnie z reklamą: exec nie posiada więcej niż ARG_MAX znaków na liście argumentów - w tym, należy zauważyć, dane środowiskowe.

 28
Author: Mike S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-22 11:32:04

Istnieje limit bufora czegoś takiego jak 1024. Odczyt po prostu powiesi mid wklej lub wejście. Aby rozwiązać ten problem, użyj opcji-e.

Http://linuxcommand.org/lc3_man_pages/readh.html

- e użyj Readline, aby uzyskać linię w interaktywnej powłoce

Zmień odczyt NA read-e i irytujące zawieszanie linii zniknie.

 -1
Author: Paul Kenjora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 22:21:14