Ich übergebe eine Variable an ein Skript in der Befehlszeile. Was ist die Zeichenbegrenzung eines Befehls? z.B:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Vielen Dank.
Ich übergebe eine Variable an ein Skript in der Befehlszeile. Was ist die Zeichenbegrenzung eines Befehls? z.B:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Vielen Dank.
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 Sie env | 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.
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
und find -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 aus fish
kann informativ sein: „Fisch: Die Gesamtgröße der Argumentation und Umgebung Listen (130kB) überschreitet die Betriebssystemgrenze von 2.0MB . " Allerdings set | wc -c
ist 306317 und env | 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).
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:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
Auf meinem System 131071 funktioniert:
und die Variable wird bei 131072 gedruckt, es ist zu groß:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
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 dass bash
es nicht erforderlich ist, einen exec()
anderen Prozess zu erzeugen. ARG_MAX
nur Fragen, die die Länge der Parameterliste der exec
Funktionen ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
, etc.).