В действительно ли globbing функция оболочки?
Я изучил, как использовать globbing в команде находки, но сегодня я видел странное поведение.
когда я нахожусь в любом месте кроме местоположения моего поиска, мне не нужны одинарные или двойные кавычки для globbing
$ pwd
/home
$ find / -name *c
...
it is ok
но
$ pwd
/
$ find / -name *c
find: paths must precede expression: proc
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Что происходит?
Когда Вы используете закрывший кавычки (или незавершенный) *
т.е. маркер шарика *
(любое количество символов т.е. любого файла), оболочка расширяется *
во все файлы в данном каталоге, в случае *c
, все файлы, заканчивающиеся в c
. Таким образом, когда Вы работаете:
find / -name *c
принятие там три .c
файлы в текущем каталоге а именно, foo.c
, bar.c
, и spam.c
, команда на самом деле работала бы:
find / -name foo.c bar.c spam.c
который является недопустимой командой, поскольку Вы видите, что она использует несколько имен файлов после сингла -name
опция. Это - то, какой случай, когда Вы в /
.
Теперь, в то время как в /home
, по-видимому, был нет *c
существующие файлы, следовательно шаблон шарика *c
будет сохранен (в bash
, это - зависимое поведение оболочки; в bash
, можно изменить поведение по умолчанию nullglob
/failglob
опции оболочки), таким образом, команда find
добирается:
find / -name *c
который является допустимой командой и как и следовало ожидать быть выполненным.
Теперь, с find
необходимо заключить в кавычки или выйти из любой оболочки globbing маркер, как Вы хотите find
для интерпретации (разворачивают) их, не заранее оболочкой. Также - любой из:
find / -name '*c'
find / -name "*c"
find / -name \*c