Risposte:
La *
(stella o asterisco) è un carattere speciale che viene (di solito) interpretato dalla shell prima che gli venga dato il comando. Viene (di solito) espanso a tutti i nomi di file tranne quelli con punti iniziali. Vedere il manuale di bash sulla corrispondenza dei motivi per ulteriori informazioni.
Se inserito tra virgolette, la stella non verrà interpretata dalla shell e viene data al comando alla lettera.
Esempi spiegati. Quello citato:
grep "string" . -r --include "*.pl"
Qui grep
riceverà l'opzione --include
con l'argomento *.pl
. Questa è la stringa di 4 caratteri con il *
carattere come primo carattere. Ciò che grep
fa con quella stringa dipende interamente da grep
. In questo caso --include
significa considerare solo i file corrispondenti allo schema *.pl
.
AFAIK dietro le quinte gnu grep usa lo stesso modello che combina lib di gnu bash.
Quello non citato:
grep "string" . -r --include *.pl
Qui la shell espande prima il modello *.pl
a tutti i nomi di file che terminano con .pl
. Supponiamo che ci siano i file foo.pl
, bar.pl
e baz.pl
. Dopo aver espanso la riga di comando appare così:
grep "string" . -r --include foo.pl bar.pl baz.pl
Qui grep
riceverà l'opzione --include
con l'argomento foo.pl
, seguita dalle opzioni bar.pl
e baz.pl
. --include foo.pl
significa considerare solo i file corrispondenti allo schema foo.pl
. Poiché non ci sono caratteri jolly nel modello, l'unico file corrispondente che sarà il file denominato foo.pl
.
Le opzioni bar.pl
e i baz.pl
mezzi che grep ricercherà anche in quei file, ma poiché non corrispondono allo schema foo.pl
verranno ignorati.
grep -r
sembrava incoerente, ma non ho mai notato che era solo quando ho usato un *
.
La differenza è che se non citate il pattern ( *.pl
) viene espanso dalla shell. Ad esempio, se esegui il tuo grep
in una directory che contiene un file chiamato foo.pl
, poiché *pl
viene espanso dalla shell, ciò che grep
effettivamente vede è:
grep "string" . -r --include foo.pl
Dal momento che gli dici di includere solo foo.pl
, cercherà solo attraverso quel file.
Se citate il vostro modello, la shell non lo espanderà e grep
otterrà il comando corretto, vale a dire
grep "string" . -r --include *pl
peopl
non verrà espanso da *.pl
.
grep
; è nel guscio.grep
non vede mai le virgolette.