web-dev-qa-db-fra.com

Globuler est-il une caractéristique du shell?

Je lis beaucoup de questions et réponses comme this et celui-ci

Je sais que les shell sont développés par le shell avant d’exécuter une commande et qu’ils sont une fonctionnalité du shell. De plus, les caractères génériques fonctionnent avec les commandes pouvant accepter de nombreux arguments. Dans find . -name *.rb si nous avons plus d'un fichier dans le répertoire en cours, find nous donnera une erreur car find ne peut pas accepter plusieurs arguments et voici comment résoudre ce problème:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

Nous échappons à l'astérisque et empêchons le développement par Shell, mais les caractères génériques sont une caractéristique de Shell; Lorsque nous échappons à l'astérisque, Shell ne connaît pas sa signification et devrait trouver un fichier nommé *.rb. Comment l'astérisque est-il développé dans ce cas?

12
Sinoosh

Oui, le shell comprend * comme tous les fichiers contenant des caractères dans le répertoire et *.rb comme tous les fichiers contenant des caractères et se terminant par .rb, et le développe en tant que tel.

La commande find accepte elle-même la suppression.

Si vous ne citez pas le *, alors le shell le développera avant la commande find voit son argument, donc au lieu d'un glob *.rb passé à find, les noms de tous les fichiers correspondant au glob du répertoire seront passés à find, et find essaiera de les interpréter en tant qu'arguments, ce qui entraînera probablement une erreur, ou le moins pas ce que vous voulez (cela ne fonctionnera correctement que s'il n'y a pas de fichiers correspondants dans le répertoire actuel)

21
Zanna