Przekazuję zmienną do skryptu w wierszu poleceń. Jaki jest limit znaków w poleceniu? na przykład:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Dzięki.
Przekazuję zmienną do skryptu w wierszu poleceń. Jaki jest limit znaków w poleceniu? na przykład:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Dzięki.
Odpowiedzi:
Narzucony limit powłoki / systemu operacyjnego jest na ogół bardzo długi - zwykle jeden lub dwieście tysięcy znaków.
getconf ARG_MAX
da ci maksymalny limit wejściowy dla polecenia. W systemie Debian mam obecnie otwarty terminal po tym zwracaniu 131072, który jest 128 * 1024. Limit jest zmniejszany przez zmienne środowiskowe, tak jakby moja pamięć służyła mi poprawnie, są one przekazywane przez powłokę w tej samej strukturze, choć w większości przypadków to zabiera tylko kilkaset znaków. Aby znaleźć przybliżenie tej wartości, uruchom env | wc -c
- sugeruje to obecnie 325 znaków na tym logowaniu na tym komputerze.
Skrypty zapewnią taką pełną długość, ale nie jest mało prawdopodobne, aby inne narzędzia narzucały własne ograniczenia celowo lub przez problemy projektowe. Mogą istnieć również sztuczne ograniczenia dotyczące długości pojedynczego argumentu w długim wierszu poleceń i / lub długości ścieżki do pliku.
getconf ARG_MAX
daje 2097152, ale maksymalna długość argumentu, którą mogę przekazać, to nadal 131071 (i nie muszę odejmować wielkości środowiska).
xargs
nawet find -exec
Twoi znajomi mają do czynienia z gigantycznymi listami argumentów.
getconf
to poziom jądra. Być może bash ustala dolną granicę poprzez swój projekt / konfigurację? Poza tym moja wiedza na ten temat pochodzi z jakiegoś czasu, więc być może ostatnio coś się zmieniło, chociaż nie jest to obszar, w którym spodziewałbym się dużo ruchu poza nowymi eksperymentalnymi pociskami.
ksh
, zsh
, dash
, fish
i atakujących 3 jak ja w Bash 4. Komunikat o błędzie z fish
może być pouczające: „ryba: Całkowity rozmiar list argumentów i Środowisko (130kB) przekracza limit systemu operacyjnego 2.0MB . ” Jednak set | wc -c
jest 306317 i env | wc -c
2507, które nie uwzględniają różnicy. Nie wiem co jeszcze się liczy.
ARG_MAX rzeczywiście ogranicza całkowity rozmiar wiersza poleceń i środowiska, ale masz do czynienia z dodatkowymi ograniczeniami: jeden argument nie może być dłuższy niż MAX_ARG_STRLEN (który niestety jest na stałe zakodowany na 131072).
Zobacz /unix/120642/what-defines-the-maximum-size-for-a-command-single-argument
Czy masz na myśli najdłuższą zmienną długość? Aby to ustalić, możesz użyć „x” Perla, aby utworzyć bardzo długą nazwę zmiennej:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
W moim systemie 131071 działa:
a zmienna jest drukowana w 131072, jest za duża:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
skryptu:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
działa.
printf
jest on wbudowany w powłokę, więc bash
nie trzeba go wykonywać w exec()
celu odrodzenia innego procesu. ARG_MAX
Liczy się tylko do długości listy argument exec
funkcji ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
, itd.).