Странное поведение для globbing в команде находки

В действительно ли 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]

Что происходит?

2
задан 13 April 2017 в 15:24

1 ответ

Когда Вы используете закрывший кавычки (или незавершенный) * т.е. маркер шарика * (любое количество символов т.е. любого файла), оболочка расширяется * во все файлы в данном каталоге, в случае *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
11
ответ дан 2 December 2019 в 01:27

Другие вопросы по тегам:

Похожие вопросы: