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 cat
les utiliser ensemble est-il sûr à utiliser cat file.{1..3} > file
?
Ce que je sais, c'est que cela cat file.*>file
pourrait 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?)
cat file.[123] >file
file.*
ne dépend pas des inodes. Il les trie toujours lexicographiquement, ce qui peut dépendre de votre paramètre de localisation.file.{1..3}
qui s'étend à tous les trois, qu'ils existent ou non.cat
erreurs avecfile.[123] not found
ou quelque chose de très utile.Réponses:
{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 venuezsh
,bash
etksh
copièrent plus tard) oùn1
etn2
sont des nombres entiers produisent tous les nombres entren1
etn2
. Tout en{x,y,z}
produisant trois personnagesx
,y
etz
.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 parfile.
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 donnera1 2 3 4 5 6 7 8 9 10
. Avec globbing, vous obtiendrez1 10 2 3 4 5 6 7 8 9
la source
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écifiques1
,2
et3
.{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 parfile.
. Si vous avez seulementfile.1
,file.2
etfile.3
puis cela aussi est équivalent aux deux autres.Quant à ses problèmes, je ne vois pas pourquoi. Vous pensez peut-être à
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:
Pour résoudre cela, vous pouvez utiliser à la
zsh
place debash
(voir ici pour plus de détails):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.
la source
*
si j'avais 10 fichiers supérieurs ou égaux, si je dépend du bon ordre?ARG_MAX
fichiers mais ce sera bien plus que 10.cat *
n'est pas bien définie. La sortie dépend du shell et de l'environnement. Voir le commentaire de Sebastian ..txt
résoudra pas le problème avecfile.*
?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:
la source