Przekazuję zmienną do skryptu w wierszu poleceń. Jaki jest limit znaków w poleceniu? na przykład:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Dzięki.
linux
command-line-interface
robdog
źródło
źródło
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, uruchomenv | 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.
źródło
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
nawetfind -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 zfish
może być pouczające: „ryba: Całkowity rozmiar list argumentów i Środowisko (130kB) przekracza limit systemu operacyjnego 2.0MB . ” Jednakset | wc -c
jest 306317 ienv | 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
źródło
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:
W moim systemie 131071 działa:
a zmienna jest drukowana w 131072, jest za duża:
źródło
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ęcbash
nie trzeba go wykonywać wexec()
celu odrodzenia innego procesu.ARG_MAX
Liczy się tylko do długości listy argumentexec
funkcji (exec()
,execl()
,execlp()
,execvp()
,execvpe()
, itd.).