Limit znaków w wierszu poleceń systemu Linux

27

Przekazuję zmienną do skryptu w wierszu poleceń. Jaki jest limit znaków w poleceniu? na przykład:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

Dzięki.

robdog
źródło
1
Nie rozumiem pytania. Czy jesteś zainteresowany limitem postaci?
krissi,
Musisz jasno określić swoje pytanie, w przeciwnym razie zostanie ono zamknięte.
ThatGraemeGuy

Odpowiedzi:

27

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.

David Spillett
źródło
2
W moim systemie getconf ARG_MAXdaje 2097152, ale maksymalna długość argumentu, którą mogę przekazać, to nadal 131071 (i nie muszę odejmować wielkości środowiska).
Wstrzymano do odwołania.
1
Pamiętaj też, że xargsnawet find -execTwoi znajomi mają do czynienia z gigantycznymi listami argumentów.
coredump
@Dennis: Myślę, że wartość zwracana przez 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.
David Spillett,
Mam takie same wyniki w 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.
Wstrzymano do odwołania.
1

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
davey
źródło
2
W rzeczywistości jest to bardzo długa wartość zmiennej .
Wstrzymano do odwołania.
3
Nie musisz także używać perlskryptu:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
Wstrzymano do odwołania.
@DennisWilliamson jednak printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nulldziała.
jarno
Wynika to z faktu, że 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.).
Vicente Olivert Riera