Le globbing est-il une caractéristique du shell?

12

J'ai lu beaucoup de questions et réponses comme celle-ci et celle-ci

Je sais que les caractères génériques sont développés par le shell avant d'exécuter une commande et qu'ils sont une fonctionnalité du shell. Les caractères génériques fonctionnent également avec les commandes qui peuvent accepter de nombreux arguments. En find . -name *.rb si nous avons plus d'un fichier dans le répertoire courant findnous donnera une erreur , car trouver ne peut pas accepter de multiples arguments et les moyens de résoudre ce sont:

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

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

Sinoosh
la source

Réponses:

21

Oui, le shell comprend *tous les fichiers avec n'importe quel caractère du répertoire et *.rbtous les fichiers avec n'importe quel caractère et fin .rb, et le développe comme tel.

La findcommande elle-même accepte le globbing.

Si vous ne citez pas le, *le shell le développera avant que la findcommande ne voie son argument, donc au lieu d'un glob *.rbpassé à find, les noms de tous les fichiers correspondant au glob dans le répertoire seront passés findet findessaieront de les interpréter comme arguments, ce qui entraînera probablement une erreur, ou du moins pas ce que vous voulez (cela ne fonctionnera correctement que s'il n'y a pas de fichiers correspondants dans le répertoire courant)

Zanna
la source
merci, cela signifie que nous disons qu'il ne s'agit pas d'un glob mais que certaines commandes peuvent étendre les caractères génériques? ou pouvons-nous dire que si nous avons un shell sans comprendre le globbing, ces commandes savent que le globbing peut les étendre?
Sinoosh
5
si le *est cité, alors le shell ne le développera pas, et l'argument incluant le glob est passé à la commande qui peut comprendre le glob - c'est la même chose pour toutes les commandes qui acceptent l'expression régulière qui doit toujours être citée ...
Zanna
1
Mon plaisir ^ _ ^
Zanna
7
@Sinoosh: Notez que toutes les commandes ne comprennent pas la syntaxe glob. Il se trouve que c'est une caractéristique defind
slebetman
1
@Sinoosh Find ne "développe" pas vraiment le caractère générique, il l'utilise comme test pour faire correspondre chaque nom de fichier qu'il rencontre. Il existe (très) peu de commandes qui développent les caractères génériques dans le sens conventionnel - décompressez et 7z peut l'utiliser pour ouvrir plusieurs archives (lorsque leurs arguments sont normalement de la forme " [archive filename single argument] [list of files to extract]") par exemple.
Random832