J'ai créé trois fichiers dans mon répertoire à l'aide de la commande touch inv{1..3}.txt
. Maintenant, j'ai utilisé deux commandes et leur sortie est à peu près la même. Ces deux commandes sont ls inv[13].txt
et ls {1,3}.txt
.
Alors, comment ces deux sont-ils différents? En quoi les crochets sont-ils différents des accolades? Je cherchais également "linux [..]", mais je n'ai rien trouvé, alors pourrais-je savoir comment ces choses sont appelées dans la terminologie linux?
Merci
command-line
bash
scripts
posixKing
la source
la source
{}
et Expansion du nom de fichier> Correspondance de modèle pour[]
.Réponses:
{}
est appelé expansion de l'accolade. Il a deux formes:{x..y}
et{x,y}
, remplacezx
ety
par n'importe quelle valeur alphabétique ou numérique.Dans le premier formulaire,
{x..y}
sera étendu à toutes les valeurs dex
ày
, inclus. Par exemple,{2..5}
sera étendu à2
,3
,4
,5
.Dans la seconde forme explicite,
{x,y}
sera étendu seulementx
,y
. Par exemple,{2,5}
sera étendu à2
et5
.Si aucune expansion n'est possible, le motif est traité littéralement, par exemple dans
{a..3}
.Une chose importante à noter est que l'expansion de l'accolade sera effectuée (si possible) indépendamment de toute correspondance de fichier, lors de la création / correspondance de fichiers.
[]
est connu comme un modèle d'expansion (ou globbing) de chemin d'accès. Contrairement à l'expansion d'accolade, vous ne pouvez l'utiliser que lors de la correspondance des noms de fichiers, elle sera traitée littéralement si vous l'utilisez lors de la création de fichiers.Il a deux formes:
[xyz...]
et[x-y]
.Dans le premier formulaire, il correspondra à tout caractère unique à l'intérieur des crochets séparément, c'est-à-dire que chaque caractère est traité individuellement. Ainsi,
[25].txt
il correspondra à un fichier nommé2.txt
ou5.txt
dans le répertoire en cours, tandis[245].txt
qu'il correspondra à n'importe quel fichier nommé2.txt
ou4.txt
ou5.txt
.Dans la deuxième forme, une extension de plage est effectuée avant de correspondre individuellement, si possible sinon traitée littéralement. Donc, pour
[2-5]. txt
, il correspondra à tout fichier nommé2.txt
ou3.txt
ou4.txt
ou5.txt
. Si la plage ne peut pas être étendue, elle sera traitée littéralement, par exemple en cas de[a-3].txt
.Une différence de comportement importante entre ces deux éléments réside dans le fait qu'il y a plus de modèles à mettre en correspondance alors que moins en fait ils correspondent. Comme l'expansion de l'accolade est effectuée, quoi qu'il en soit, cela montrera l'erreur que certains fichiers n'existent pas tandis que l'expansion du nom de chemin correspondra autant que possible sans aucune erreur pour le reste:
Remarque sur la portabilité:
L'
[]
opérateur d'expansion de nom de chemin est défini par POSIX, donc portable entre le shell Bourne et ses dérivés.L'expansion d'accolade,,
{}
n'est pas définie par POSIX et n'est donc pas portable entre tous les shells. Par exemple,dash
(sh
dans Ubuntu) n'a pas cela. Il a été emprunté àcsh
et travailler sur certaines coquilles seulement par exemplebash
,zsh
,ksh93
,fish
. Assurez-vous que le shell que vous utilisez prend en charge cela avant de l'implémenter.Exemple:
la source
[
]
expansion lorsqu'il n'y a pas de correspondance car cela peut être différent selon la configuration du shell. Si vous souhaitez utiliser[
ou]
dans un nom de fichier, il doit être cité dans vos commandes. Il convient également de noter la différence entre{13..79}
et[13-79]
. La première produira tous les nombres dans la plage de13
à79
, la seconde correspondra aux personnages1
,3
,4
,5
,6
,7
et9
.nullglob
(ou similaire). À propos de l'[13-79]
appariement, je pense que j'ai mentionné clairement dans ma réponse le comportement par caractère de [] '.ksh
avoir cette fonctionnalité, mais pas ses saveurs plus modernes, comme mksh et pkdshLa principale différence entre les deux formes est illustrée ici:
inv[15].txt
est un glob et étendra la liste des fichiers correspondants sur votre système de fichiers. Il s'agit d'une extension de nom de chemin .inv{1,5}.txt
se développeinv1.txt
etinv5.txt
quels que soient les fichiers qui se trouvent réellement sur votre système de fichiers. C'est l' expansion de l'accolade .la source
ba{con,tman}
et qu'il n'y a pas d'équivalent en utilisant des crochets. IOW, l'expansion d'accolade n'est pas seulement pour les personnages uniques.