Bash-Befehlszeile und Eingabebegrenzung
Gibt es irgendeine Art von Zeichen beschränken, die in der bash (oder einer anderen shells) wie lange ein Eingang sein kann? Wenn ja, was ist das Zeichen?
I. e. Ist es möglich, schreiben Sie einen Befehl in der bash, die ist zu lang für die Kommandozeile ausführen?
Wenn es ist nicht erforderlich, zu begrenzen, gibt es eine empfohlene Grenze?
InformationsquelleAutor der Frage Derek Halden | 2013-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Grenze für die Länge einer Kommandozeile ist nicht die von der shell, sondern durch das Betriebssystem. Diese Grenze ist in der Regel im Bereich von hundert Kilobyte. POSIX bezeichnet diese Grenze
ARG_MAX
und auf POSIX-konformen Systemen können Sie die Abfrage mitE. g. auf der Cygwin-dies ist 32000 und auf die verschiedenen BSDs und Linux-Systeme benutze ich, es ist überall von 131072 2621440.
Wenn Sie verarbeiten müssen, die eine Liste von Dateien, die diese Grenze übersteigenden, möchten Sie vielleicht Blick auf die
xargs
- Dienstprogramm, das ein Programm aufruft wiederholt mit einem Teil der Argumente nicht mehr alsARG_MAX
.Beantworten Ihre spezifische Frage, ja, es ist möglich, um zu versuchen, um einen Befehl auszuführen, der mit zu eine lange Liste von Argumenten. Die shell-Fehler mit einer Meldung "argument list too long".
Beachten Sie, dass die Eingang zu einem Programm (wie Lesen von stdin oder einem anderen Datei-Deskriptor) ist nicht begrenzt (nur durch den verfügbaren Programm-Ressourcen). Also, wenn Ihr shell-Skript liest eine Zeichenkette in einer Variablen, Sie sind nicht eingeschränkt durch
ARG_MAX
.InformationsquelleAutor der Antwort Jens
Ok, Bewohner. So habe ich angenommen, der Befehl Zeile Längenbeschränkungen wie Evangelium schon seit einiger Zeit. Was also tun mit den Annahmen? Natürlich - überprüfen Sie Sie.
Ich habe ein Fedora 22 der Maschine die mir zur Verfügung standen (Bedeutung: Linux mit bash4). Ich habe erstellt ein Verzeichnis mit 500.000 inodes (Dateien) in jedes der 18 Zeichen lang ist. Die Befehlszeile Länge ist 9,500,000 Zeichen. So entstanden:
Und wir beachten Sie:
Beachten Sie jedoch, dass ich dies tun kann:
Aber dies schlägt fehl:
Kann ich eine for-Schleife:
die anderen shell-builtin.
Sorgfältige Lektüre der Dokumentation für
ARG_MAX
Staaten, Maximale Länge der als argument der exec-Funktionen. Das bedeutet: Ohne den Aufrufexec
gibt es keineARG_MAX
Einschränkung. So würde es erklären, warum die shell gelieferten sind nicht eingeschränkt durchARG_MAX
.Und in der Tat, ich kann
ls
meinem Verzeichnis, wenn mein argument Liste ist 109948 Dateien lang, oder über 2,089,000 Zeichen (geben oder nehmen). Sobald ich fügen Sie eine weitere 18-Zeichen mit dem Namen der Datei, obwohl, dann bekomme ich die Argument-Liste zu lang Fehler. SoARG_MAX
ist wie beworben: die exec-Versagen mit mehr alsARG_MAX
Zeichen auf der Liste der Argumente - auch, es sollte beachtet werden, die Umwelt-Daten.InformationsquelleAutor der Antwort Mike S
Es ist eine Puffer-limit von so etwas wie 1024. Das Lesen wird einfach hängen Mitte einfügen oder Eingabe. Um dieses Problem zu lösen verwenden Sie die option-e.
http://linuxcommand.org/lc3_man_pages/readh.html
-e die Verwendung mit Readline zu erhalten, die Linie in einer interaktiven shell
Ändern Sie Ihre Lesen Lesen -e und nervig line-Eingang hängen, geht Weg.
InformationsquelleAutor der Antwort Paul Kenjora