Korzystanie {html,php,htm}
może pracować tylko jako rozszerzenie usztywniającym , który jest nietypowa (nie POSIX) cechą bash
, ksh
i zsh
.
Innymi słowy: nie próbuj używać go w skrypcie, który jest przeznaczony /bin/sh
- w takim przypadku użyj jawnych wielu --include
argumentów.
grep
sama nie rozumie {...}
notacji.
Aby interpretacja nawiasów została rozpoznana, musi to być niecytowany (część) token w wierszu poleceń.
Rozwinięcie nawiasów klamrowych rozszerza się do wielu argumentów , więc w omawianym przypadku grep
kończy się wyświetleniem wielu --include=...
opcji, tak jakbyś przeszedł je indywidualnie.
Wyniki rozwijania nawiasów klamrowych podlegają globalizacji (rozwijaniu nazw plików) , co ma pułapki :
Każdą otrzymaną argument można dodatkowo rozszerzyć do dopasowania nazwami jeśli zdarzy się, że zawiera nienotowanych metaznaki plików takich jak *
.
Chociaż jest to mało prawdopodobne w przypadku tokenów, takich jak --include=*.html
(np. Musiałbyś mieć plik o dosłownie nazwie podobnej --include=foo.html
do czegoś, co ma pasować), warto o tym ogólnie pamiętać.
Jeśli nullglob
opcja powłoki jest włączona ( shopt -s nullglob
) i globbing nie pasuje do niczego , argument zostanie odrzucony .
Dlatego, aby uzyskać w pełni solidne rozwiązanie , użyj następujących elementów:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
jest traktowany jako literał , ponieważ występuje w pojedynczym cudzysłowie ; zapobiega to nieumyślnej interpretacji *
jako globbing postaci.
{html,php,htm}
The - konieczności - niecytowany rozszerzalności usztywniającym [1]
, rozszerza się 3 argumentów, które ze względu na {...}
następujące bezpośrednio po '...'
żeton , zawierających ten symbol.
Dlatego po usunięciu cytatu przez powłokę, następujące 3 dosłowne argumenty są ostatecznie przekazywane dogrep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Dokładniej, tylko te części rozwinięcia nawiasów klamrowych, które mają znaczenie dla składni , muszą być niecytowane, elementy listy mogą nadal być cytowane indywidualnie i muszą być, jeśli zawierają globbing metaznaki, które mogą skutkować niepożądanym globowaniem po rozwinięciu nawiasów; chociaż nie jest to konieczne w tym przypadku, powyższe można zapisać jako
'--include=*.'{'html','php','htm'}