In diesem Beispiel beziehe ich mich auf die Erweiterung einer Folge von ganzen Zahlen, aber vielleicht (?) Wären die Grenzen für alle Aspekte der Klammererweiterung relevant. Diese allgemeinere Ansicht ist auch für mich von Interesse.
seq
scheint viel längere ganzzahlige Sequenzen zu verarbeiten als die {1..n} Klammererweiterung (zumindest ist dies in diesem Beispiel der Fall).
zB 'seq -f @% 12.0f 1 1000000000> / dev / null'. Dies erweitert 1 Milliarde ziemlich glücklich in 14m 04s
Allerdings echo {1..10000000000} >/dev/null
stürzt in Vergessenheit von der CLI in 'gnome-terminal' und 'konsole' (... Auf Wiedersehen Terminal - Session!)
Das Beste, was ich aus der Klammererweiterung für eine ganzzahlige Sequenz herausholen kann, ist ungefähr {1..15000000} .. nur 15 Millionen.
Ist dies eine Einschränkung der Klammererweiterung selbst oder des Umgangs echo
mit den erweiterten Daten? Es scheint durch die Verwendung des gesamten verfügbaren Arbeitsspeichers verursacht zu werden, aber ich dachte, es würde den swap
Bereich an diesem Punkt nutzen ...
Außerdem (übrigens) echo {..}
dauert diese 15000000-Ganzzahlsequenz 57,0 s; während seq
dauert nur 12,7s ...
quelle
bash: xmalloc: ../../../bash/lib/sh/stringvec.c:40: cannot allocate 11280523272 bytes (0 bytes allocated)
. (Bash 3.2.39, amd64.) 15000000 verursachte zu viel Tausch, also habe ich es getötet. Sie verlangen einfach zu viel von der armen Bash.Antworten:
echo {1..5}
wird in den Befehl erweitert,echo 1 2 3 4 5
der dann auf die übliche Weise erweitert wird. Es ist überhaupt nicht ähnlich zuseq 1 1000000000 >/dev/null
, was niemals zu einem Befehl mit sehr vielen Argumenten erweitert wird.Es ist eher so
echo $(seq 1 1000000000)
: Ich denke, das bricht auf die gleiche Weise?Das Problem, auf das Sie stoßen, besteht in der Handhabung großer Befehle, bei denen Unix immer pingelig war, dh es handelt sich um ein allgemeines Problem bei der Handhabung von Befehlszeichenfolgen. Es ist eines der Dinge, für deren Behebung Perl geschrieben wurde.
Ich würde sowieso einen höflichen und informativen Fehlerbericht einreichen: Es könnte eine interessante Diskussion hervorrufen.
quelle
echo $(seq 1 1000000000)
, aber das Terminal war verschwunden :) ... Also, ich verstehe, dass es nichts spezielles mit entwederecho
oder Klammererweiterung zu tun hat . . und dass es einfach darum geht, dass der Arbeitsspeicher knapp wird ... Übrigens, dieses Problem ergab sich aus dieser Frage: unix.stackexchange.com/questions/8273/…Ich denke, diese Erweiterung ist nicht dafür gedacht, auf diese Weise verwendet zu werden. Der Absturz weist zwar auf einen Fehler hin, der jedoch selten ausgelöst wurde.
Wie praktisch ist es Ihrer Meinung nach, Milliarden aufeinanderfolgender Ganzzahlen für irgendetwas einzugeben?
quelle
seq
unpraktisch? es kann um Größenordnungen höher gehen ... Ist es praktisch? absolut (wenn Sie es brauchen), ist es selten? Ich weiß es nicht, aber ich vermute es ... aber ein LKW auf der Autobahn, den Sie nicht sehen, ist auch selten, aber es ist ziemlich wichtig :) ... Allerdings brauche ich ihn jetzt und suche ihn Die beste Option ... Aufgrund dieses Absturzes der 'Integer-Sequenz' wurde eine umfassendere Frage ausgelöst. "Was regelt die Grenzen der Erweiterung der Schalenstrebe?"