Différence entre {1,2,3} et {1..3}

17

Y a-t-il une différence entre les séquences {1,2,3}et {1..3}?

Par exemple, si j'ai des fichiers

file.1
file.2
file.3

et je veux catles utiliser ensemble est-il sûr à utiliser cat file.{1..3} > file?

Ce que je sais, c'est que cela cat file.*>filepourrait causer des problèmes car le shell peut parfois étendre les fichiers de manière aléatoire (je pense que cela dépend des inodes, n'est-ce pas?)

syss
la source
1
utilisationcat file.[123] >file
mikeserv
3
L'ordre d'expansion de file.*ne dépend pas des inodes. Il les trie toujours lexicographiquement, ce qui peut dépendre de votre paramètre de localisation.
Barmar
1
"dépend des inodes" sonne comme une phase de l'une des scènes "informatiques" criminelles les plus recherchées.
Alec Teal
1
@mikeserv, je crois que je l'ai - c'est un glob de shell, donc il ne se développe que sur les fichiers qui existent réellement, non? Contre. file.{1..3}qui s'étend à tous les trois, qu'ils existent ou non.
Wildcard
1
@Wildcard - c'est vrai, tant qu'il y en a au moins un, c'est-à-dire. Sinon, il ne se développe pas du tout et des caterreurs avec file.[123] not foundou quelque chose de très utile.
mikeserv

Réponses:

18

{1..3}et {1,2,3}produire le même résultat, mais de manière différente.

En général, {n1..n2}(qui est d' abord venue zsh, bashet kshcopièrent plus tard) où n1et n2sont des nombres entiers produisent tous les nombres entre n1et n2. Tout en {x,y,z}produisant trois personnages x, yet z.

Dans votre cas, vous pouvez utiliser en toute sécurité cat file.{1..3} > file

Maintenant, dans le cas de cat file.*>file, vous avez utilisé la globalisation du shell , qui produit tous les noms de fichiers commençant par file.et le résultat sera trié en fonction de l'ordre de classement dans les paramètres régionaux actuels.

Vous êtes toujours en sécurité, mais plus lorsque vous avez plus de 10 fichiers. {1..10}vous donnera 1 2 3 4 5 6 7 8 9 10. Avec globbing, vous obtiendrez1 10 2 3 4 5 6 7 8 9

cuonglm
la source
8

La différence est que l'un est une liste et l'autre une séquence. {1,2,3}se dilate à trois éléments spécifiques 1, 2et 3. {1..3}s'étend à la liste des nombres entre un et trois. Dans ce cas particulier, ils sont identiques et vous pouvez utiliser l'un des deux. file.*s'étendra à tous les fichiers et répertoires du répertoire actuel dont le nom commence par file.. Si vous avez seulement file.1, file.2et file.3puis cela aussi est équivalent aux deux autres.

Quant à ses problèmes, je ne vois pas pourquoi. Vous pensez peut-être à

$ cat file.* > file.txt
cat: file.txt: input file is output file

Cependant, c'est une question complètement différente. Le seul autre problème auquel je peux penser est que votre shell peut ne pas répertorier les fichiers dans le bon ordre. Par exemple:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

Pour résoudre cela, vous pouvez utiliser à la zshplace de bash(voir ici pour plus de détails):

% echo f*(n)
file1 file2 file11

En général, les trois approches ne sont pas les mêmes. Cela dépend de ce que vous voulez faire. Dans les cas où les trois renvoient la même sortie, oui, vous pouvez utiliser n'importe lequel d'entre eux. Ça ne fait aucune différence. Toutes ces extensions sont effectuées par le shell et se produisent avant d' être passées à la commande qui les utilise.

terdon
la source
n'y aurait-il pas un problème *si j'avais 10 fichiers supérieurs ou égaux, si je dépend du bon ordre?
syss
1
@syss no. Ce serait un problème si vous aviez plus de ARG_MAXfichiers mais ce sera bien plus que 10.
terdon
1
@terdon Il demandait s'ils apparaîtront dans l'ordre numérique (c'est-à-dire pas "1, 10, 2"), pas s'ils débordent le tableau d'arguments.
Random832
3
@terdon Je pense que @syss a raison de dire que la sortie de cat *n'est pas bien définie. La sortie dépend du shell et de l'environnement. Voir le commentaire de Sebastian .
Marco
L'ajout ne .txtrésoudra pas le problème avec file.*?
Ismael Miguel
6

Ce sont les mêmes, mais cela dépend de la version bash que vous avez installée si elles sont disponibles.

De cette page:

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4
cristi
la source