Odpowiedzi:
*
(Gwiazda lub gwiazdka) to specjalny znak, który jest (zazwyczaj) interpretowane przez powłokę przed podaniem komendy. Jest (zwykle) rozszerzony na wszystkie nazwy plików oprócz tych z wiodącymi kropkami. Aby uzyskać więcej informacji, zobacz instrukcję bash dotyczącą dopasowywania wzorów .
Umieszczona w cudzysłowie gwiazda nie będzie interpretowana przez powłokę i zostanie przekazana do polecenia dosłownie.
Przykłady wyjaśnione. Cytowany:
grep "string" . -r --include "*.pl"
Tutaj grep
otrzymasz opcję --include
z argumentem *.pl
. Jest to ciąg 4 znaków, w którym *
znak jest pierwszym znakiem. Wszystko, co grep
dzieje się z tym ciągiem, zależy całkowicie grep
. W tym przypadku --include
oznacza rozważenie tylko plików pasujących do wzorca *.pl
.
AFAIK za sceną gnu grep używa tego samego wzorca dopasowującego lib jak gnu bash.
Nie cytowany:
grep "string" . -r --include *.pl
Tutaj powłoka najpierw rozszerzy wzór *.pl
do wszystkich nazw plików kończących się na .pl
. Załóżmy, że istnieją pliki foo.pl
, bar.pl
a baz.pl
. Po rozwinięciu wiersz poleceń wygląda następująco:
grep "string" . -r --include foo.pl bar.pl baz.pl
Tutaj grep
otrzymasz opcję --include
z argumentem foo.pl
, a następnie opcje bar.pl
i baz.pl
. --include foo.pl
oznacza rozważenie tylko plików pasujących do wzorca foo.pl
. Ponieważ we wzorcu nie ma symboli wieloznacznych, jedynym pasującym plikiem będzie plik o nazwie foo.pl
.
Opcje bar.pl
i baz.pl
środki grep będą również wyszukiwać w tych plikach, ale ponieważ nie pasują do wzorca foo.pl
, zostaną zignorowane.
grep -r
wydawało się to niespójne, ale nigdy nie zauważyłem, że było to tylko wtedy, gdy użyłem *
.
Różnica polega na tym, że jeśli nie zacytujesz wzorca ( *.pl
), zostanie on rozwinięty przez powłokę. Na przykład, jeśli uruchomisz swój grep
w katalogu, który zawiera plik o nazwie foo.pl
, ponieważ *pl
jest on rozwijany przez powłokę, tak grep
naprawdę widzi:
grep "string" . -r --include foo.pl
Ponieważ nakazujesz, aby zawierał foo.pl
tylko, przeszuka tylko ten jeden plik.
Jeśli zacytujesz swój wzór, powłoka go nie rozwinie i grep
otrzyma prawidłowe polecenie, a mianowicie
grep "string" . -r --include *pl
peopl
nie zostanie rozszerzony o *.pl
.
grep
; jest w skorupce.grep
nigdy nie widzi cytatów.