Was regelt die Grenzen der Expansion von Schalenstreben?

7

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/nullstü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 echomit den erweiterten Daten? Es scheint durch die Verwendung des gesamten verfügbaren Arbeitsspeichers verursacht zu werden, aber ich dachte, es würde den swapBereich an diesem Punkt nutzen ...

Außerdem (übrigens) echo {..}dauert diese 15000000-Ganzzahlsequenz 57,0 s; während seqdauert nur 12,7s ...

Peter.O
quelle
Die Frage ist interessant, aber ich denke, die "echte" Antwort - das heißt jenseits des akademischen Interesses - ist definitiv eines dieser Anzeichen dafür, dass es Zeit ist, auf eine Skriptsprache umzusteigen .
Mattdm
1
Sie fordern zu viel Speicher von Bash. Auf meinem Computer stürzte 10000000000 sofort mit ab 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.
Gilles 'SO - hör auf böse zu sein'

Antworten:

7

echo {1..5}wird in den Befehl erweitert, echo 1 2 3 4 5der dann auf die übliche Weise erweitert wird. Es ist überhaupt nicht ähnlich zu seq 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.

Charles Stewart
quelle
Danke für die Antwort. Ihr Kommentar "Es ist überhaupt nicht ähnlich wie seq ..." brachte die Dinge in scharfe Erleichterung; Der Penny ist gefallen ... Ich habe gerade Alt-Tabbed, um mein Terminal auf den Fortschritt von zu überprüfen echo $(seq 1 1000000000), aber das Terminal war verschwunden :) ... Also, ich verstehe, dass es nichts spezielles mit entweder echooder 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/…
Peter.O
@fred: Es könnte ein Seg-Fehler sein, der auf einen internen Pufferüberlauf zurückzuführen ist, oder es könnte sein, dass ein Betriebssystemlimit überschritten wird und das Programm die Fehlerbedingung nicht ordnungsgemäß behandelt. Beachten Sie, dass die Erweiterung von der Shell und nicht vom Terminal erfolgt. Möglicherweise haben Ihre Terminalprogramme die Einstellung "Beim Beenden der Shell nicht schließen". Auf diese Weise können Sie sehen, wie die Shell beendet wird.
Charles Stewart
1

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?

Alex
quelle
2
Es ist nicht nur praktisch, es ist wichtig, wenn Sie es brauchen ... Sind die Designer sequnpraktisch? 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?"
Peter.O
@alex: Dies ist keine wirkliche Antwort auf die Frage, sondern eine Möglichkeit, darauf hinzuweisen, dass es sich nicht lohnt, die Frage zu stellen.
Bilderstürmer
1
Dies ist auch kein wirklicher Kommentar.
Alex