Gibt es einen Unterschied zwischen den Sequenzen {1,2,3}
und {1..3}
?
Zum Beispiel, wenn ich einige Dateien habe
file.1
file.2
file.3
und ich möchte cat
sie zusammen benutzen ist es sicher cat file.{1..3} > file
?
Ich weiß, dass cat file.*>file
dies zu Problemen führen kann, da die Shell die Dateien manchmal zufällig erweitern kann (ich denke, das hängt von den Inodes ab, oder?)
cat file.[123] >file
file.*
ist nicht abhängig von den Inodes. Es sortiert sie immer lexikografisch, was von Ihrer Lokalisierungseinstellung abhängen kann.file.{1..3}
was sich auf alle drei ausdehnt, ob sie existieren oder nicht.cat
Fehler mitfile.[123] not found
oder etwas sehr Nützliches auf.Antworten:
{1..3}
und{1,2,3}
produzieren das gleiche Ergebnis, aber auf andere Weise.In der Regel
{n1..n2}
(die zuerstzsh
kambash
undksh
später kopierte), won1
undn2
sind ganze Zahlen produzieren alle Zahlen zwischenn1
undn2
. Während{x,y,z}
drei Zeichen erzeugenx
,y
undz
.In Ihrem Fall sind Sie sicher zu bedienen
cat file.{1..3} > file
In diesem Fall
cat file.*>file
haben Sie die Shell-Globbing-Methode verwendet , bei der alle Dateinamen beginnenfile.
und das Ergebnis anhand der Sortierreihenfolge in der aktuellen Ländereinstellung sortiert wird.Sie sind immer noch sicher, aber nicht mehr, wenn Sie mehr als 10 Dateien haben.
{1..10}
werde dir geben1 2 3 4 5 6 7 8 9 10
. Während mit Globbing, werden Sie bekommen1 10 2 3 4 5 6 7 8 9
quelle
Der Unterschied besteht darin, dass einer eine Liste und der andere eine Sequenz ist.
{1,2,3}
erweitert , um drei bestimmte Elemente,1
,2
, und3
.{1..3}
Erweitert die Liste der Zahlen zwischen eins und drei. In diesem speziellen Fall sind sie identisch und Sie können eine der beiden Optionen verwenden.file.*
wird auf alle Dateien und Verzeichnisse im aktuellen Verzeichnis erweitert, deren Name mit beginntfile.
. Wenn Sie nur habenfile.1
,file.2
undfile.3
dann ist das auch gleichbedeutend mit den anderen beiden.Was die verursachenden Probleme angeht, verstehe ich nicht warum. Sie könnten darüber nachdenken
Das ist jedoch ein ganz anderes Thema. Das einzige andere Problem, an das ich denken kann, ist, dass Ihre Shell die Dateien möglicherweise nicht in der richtigen Reihenfolge auflistet. Beispielsweise:
Um das zu lösen, können Sie
zsh
anstelle vonbash
(siehe hier für Details) verwenden:Im Allgemeinen sind die drei Ansätze nicht gleich. Es hängt davon ab, was Sie tun möchten. In den Fällen, in denen die drei dann die gleiche Ausgabe zurückgeben, können Sie eine von ihnen verwenden. Es macht keinen Unterschied. Alle diese Erweiterungen werden von der Shell ausgeführt und erfolgen, bevor sie an einen beliebigen Befehl übergeben werden, der sie verwendet.
quelle
*
Wäre es nicht problematisch, wenn ich mehr oder gleich 10 Dateien hätte, wenn ich auf die richtige Reihenfolge angewiesen wäre?ARG_MAX
Dateien hätten, aber das wird viel, viel mehr als 10 sein.cat *
nicht gut definiert ist. Die Ausgabe hängt von der Shell und der Umgebung ab. Siehe Sebastians Kommentar ..txt
das Problem durch Hinzufügen nicht gelöstfile.*
?Sie sind gleich, aber es hängt von der installierten Bash-Version ab, ob sie verfügbar sind.
Von dieser Seite:
quelle