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_MAXda 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_MAXdaje 2097152, ale maksymalna długość argumentu, którą mogę przekazać, to nadal 131071 (i nie muszę odejmować wielkości środowiska).
xargsnawet find -execTwoi znajomi mają do czynienia z gigantycznymi listami argumentów.
getconfto 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, fishi atakujących 3 jak ja w Bash 4. Komunikat o błędzie z fishmoże być pouczające: „ryba: Całkowity rozmiar list argumentów i Środowisko (130kB) przekracza limit systemu operacyjnego 2.0MB . ” Jednak set | wc -cjest 306317 i env | wc -c2507, 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
perlskryptu:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nulldziała.
printfjest on wbudowany w powłokę, więc bashnie trzeba go wykonywać w exec()celu odrodzenia innego procesu. ARG_MAXLiczy się tylko do długości listy argument execfunkcji ( exec(), execl(), execlp(), execvp(), execvpe(), itd.).