Pour le bash
coque, '{}'
et {}
sont interchangeables. Ce n'est pas le cas avec tous les shells (comme fish
).
Mettre l'argument entre guillemets simples indique explicitement que les accolades doivent être envoyées à find
. Selon l'utilisation, le shell bash remplace parfois le contenu des accolades.
Comme on le voit ci-dessous, bash ne remplace pas les crochets vides et ils sont transmis à la commande. Pour le find
commande, peu importe.
$ echo {}
{}
$ echo {1}
{1}
$ echo {1,3}
1 3
$ echo '{1,3}'
{1,3}
Pour la plupart des utilisateurs (en particulier ceux qui utilisent des shells POSIX), il n'y a aucune différence.
Selon la section Exemple de la page de manuel pour GNU find
:
Notez que les accolades sont entourées de guillemets simples pour les protéger de l'interprétation en tant que ponctuation de script shell.
Je pense que le ou les auteurs de la page de manuel GNU font preuve de prudence, mais je note que tous les exemples de leur page de manuel ne citent pas les accolades. Ces exemples de la documentation officielle de recherche GNU omettent également les guillemets.
Dans les exemples de la spécification POSIX / Single UNIX, les accolades ne sont pas entre guillemets lorsqu'il est utilisé avec le -exec
option.
Avec un shell POSIX, l'expansion des paramètres ne se produit que lorsqu'il y a des paramètres spéciaux entre les accolades - mais pas avec des accolades vides .
Le shell Bash inclut l'extension des accolades en tant que fonctionnalité (non portable), mais ces modèles ne sont étendus que lorsqu'une virgule ou des points sont inclus dans les accolades . Bash utilise également des accolades pour le groupement de commandes, mais cela ne se produit que s'il existe réellement il y a un groupe de commandes dans l'accolade.
Enfin, j'ai essayé d'exécuter find -exec ls -l {} \;
en sh
, dash
et tcsh
mais aucun de ces shells n'a étendu le {}
dans n'importe quoi d'autre. Comme d'autres l'ont souligné, le fish
le shell traite {}
spécialement mais ce n'est pas un shell POSIX (ce que ses créateurs et utilisateurs considèrent comme un avantage). Cela ne fait pas de mal de citer les accolades mais les dactylographes paresseux qui n'utilisent pas la coquille de poisson ne devraient pas se sentir coupables de les omettre.
Avec presque tous les interpréteurs de shell disponibles, il n'y a absolument aucune différence entre '{}'
et {}
.
Les guillemets simples sont normalement utilisés pour empêcher la chaîne intégrée d'être remplacée par autre chose, par exemple :
'a b'
est un seul paramètre de trois caractères, sans les guillemets, ce serait deux paramètres d'un seul caractère'$b'
est littéralement le signe dollar suivi de la lettre b, sans le guillemet qui serait tout ce que contient la variable b et peut-être rien si elle n'est pas définie'!!'
sont des points d'exclamation littéraux alors qu'ils ne sont pas entre guillemets et avec certains shells interactifs, ils s'étendraient jusqu'à la dernière commande placée dans l'historique'*'
est un astérisque littéral, sans guillemets il serait remplacé par la liste des noms de fichiers non cachés dans le répertoire courant.
Comme ni la norme POSIX ni les shells traditionnels (sh
(Bourne), ksh
, bash
, ash
, dash
, zsh
, csh
, tcsh
) développer {}
à autre chose, les guillemets ne sont pas obligatoires.
Cependant, il existe un shell exotique, nommé fish
, qui se trouve développer {}
sous forme de chaîne vide, par exemple :
> ps -p %self
PID TTY TIME CMD
5247 pts/1 00:00:00 fish
> echo a {} b '{}'
a b {}
C'est probablement la raison pour laquelle GNU find
la documentation suggère de protéger {}
contre l'interprétation avec des guillemets ou des barres obliques inverses.