Ich übergebe eine Variable an ein Skript in der Befehlszeile. Was ist die Zeichenbegrenzung eines Befehls? z.B:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Vielen Dank.
linux
command-line-interface
Robdog
quelle
quelle
Antworten:
Das von der Shell / OS auferlegte Limit ist im Allgemeinen sehr lang - normalerweise ein oder zweihunderttausend Zeichen.
getconf ARG_MAX
gibt Ihnen die maximale Eingabegrenze für einen Befehl. Auf dem Debian-System habe ich derzeit ein Terminal geöffnet, auf dem 131072 zurückgegeben wird, also 128 * 1024. Die Begrenzung wird durch Ihre Umgebungsvariablen verringert, als ob mein Speicher mir richtig dient. Diese werden in der gleichen Struktur von der Shell übergeben, obwohl dies in den meisten Fällen nur einige hundert Zeichen kostet. Um eine Annäherung an diesen Wert zu finden, führen Sieenv | wc -c
Folgendes aus: Bei dieser Anmeldung auf diesem Computer werden derzeit 325 Zeichen vorgeschlagen.Es ist wahrscheinlich, dass Skripte diese vollständige Länge zulassen, aber es ist nicht unwahrscheinlich, dass andere Dienstprogramme absichtlich oder aufgrund von Designproblemen ihre eigenen Grenzen festlegen. Es kann auch künstliche Grenzen geben, wie lang ein einzelnes Argument in einer langen Befehlszeile und / oder wie lang ein Pfad zu einer Datei sein kann.
quelle
getconf ARG_MAX
gibt 2097152 an, aber die maximale Arg-Länge, die ich übergeben kann, ist immer noch 131071 (und ich muss die Größe der Umgebung nicht abziehen).xargs
undfind -exec
sind Sie sogar Ihre Freunde, wenn Sie sich mit riesigen Argumentationslisten beschäftigen.getconf
ist, glaube ich, die Kernel-Ebene. Vielleicht setzt bash durch Design / Konfiguration eine Untergrenze? Mein Wissen darüber stammt auch aus einer Zeit vor einiger Zeit, so dass es sein kann, dass sich die Dinge in letzter Zeit ein wenig geändert haben, obwohl es kein Bereich ist, in dem ich viel Bewegung erwarten würde, außer in neuen experimentellen Schalen.ksh
,zsh
,dash
,fish
und Bash 3 als ich in Bash 4. Die Fehlermeldung hatte ausfish
kann informativ sein: „Fisch: Die Gesamtgröße der Argumentation und Umgebung Listen (130kB) überschreitet die Betriebssystemgrenze von 2.0MB . " Allerdingsset | wc -c
ist 306317 undenv | wc -c
2507, die den Unterschied nicht berücksichtigen. Ich weiß nicht, was sonst noch gezählt wird.ARG_MAX begrenzt zwar die Gesamtgröße der Befehlszeile und der Umgebung, aber Sie haben eine zusätzliche Einschränkung: Ein Argument darf nicht länger als MAX_ARG_STRLEN sein (was leider mit 131072 fest codiert ist).
Siehe https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument
quelle
Meinen Sie, was ist die längste variable Länge? Um das herauszufinden, können Sie Perls "x" verwenden, um einen sehr langen Variablennamen zu erstellen:
Auf meinem System 131071 funktioniert:
und die Variable wird bei 131072 gedruckt, es ist zu groß:
quelle
perl
Skript und verwenden:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
funktioniert jedoch.printf
liegt daran, dass eine Shell eingebaut ist, so dassbash
es nicht erforderlich ist, einenexec()
anderen Prozess zu erzeugen.ARG_MAX
nur Fragen, die die Länge der Parameterliste derexec
Funktionen (exec()
,execl()
,execlp()
,execvp()
,execvpe()
, etc.).