Zeichenlimit für Linux-Befehlszeile

26

Ich übergebe eine Variable an ein Skript in der Befehlszeile. Was ist die Zeichenbegrenzung eines Befehls? z.B:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

Vielen Dank.

Robdog
quelle
1
Ich verstehe die Frage nicht. Interessieren Sie sich für die Zeichenbegrenzung?
Krissi
Sie müssen Ihre Frage klarer formulieren, sonst wird sie geschlossen.
ThatGraemeGuy

Antworten:

25

Das von der Shell / OS auferlegte Limit ist im Allgemeinen sehr lang - normalerweise ein oder zweihunderttausend Zeichen.

getconf ARG_MAXgibt 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 -cFolgendes 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.

David Spillett
quelle
2
Auf meinem System getconf ARG_MAXgibt 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).
Bis auf weiteres angehalten.
1
Denken Sie auch daran xargsund find -execsind Sie sogar Ihre Freunde, wenn Sie sich mit riesigen Argumentationslisten beschäftigen.
Coredump
@Dennis: Der von zurückgegebene Wert getconfist, 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.
David Spillett
Ich erhalte die gleichen Ergebnisse in ksh, zsh, dash, fishund Bash 3 als ich in Bash 4. Die Fehlermeldung hatte aus fishkann informativ sein: „Fisch: Die Gesamtgröße der Argumentation und Umgebung Listen (130kB) überschreitet die Betriebssystemgrenze von 2.0MB . " Allerdings set | wc -cist 306317 und env | wc -c2507, die den Unterschied nicht berücksichtigen. Ich weiß nicht, was sonst noch gezählt wird.
Bis auf weiteres angehalten.
1

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
Davey
quelle
2
Eigentlich ist das ein sehr langer variabler Wert .
Bis auf weiteres angehalten.
3
Außerdem müssen Sie kein perlSkript und verwenden:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
Bis auf weiteres angehalten.
@DennisWilliamson printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullfunktioniert jedoch.
jarno
Das printfliegt daran, dass eine Shell eingebaut ist, so dass bashes nicht erforderlich ist, einen exec()anderen Prozess zu erzeugen. ARG_MAXnur Fragen, die die Länge der Parameterliste der execFunktionen ( exec(), execl(), execlp(), execvp(), execvpe(), etc.).
Vicente Olivert Riera