Использование двойных кавычек или их отсутствие с подстановочными знаками

Использование двойных кавычек или их отсутствие с подстановочными знаками

Я наткнулся наэтотстатья, в которой делается попытка объяснить команду find. В ней приводится пример

find /tmp -iname "data*.txt"

теперь эта статьяздесьговорится, что

Двойные кавычки не подавляют замену слов, начинающихся с «$».но они подавляют расширение подстановочных знаков.

Также, когда я попробовал две команды

admin@localhost Downloads$ ls
gallifrey-road-doctors-14437-1366x768.jpg  mydir
admin@localhost Downloads$ find . -iname "*gall*"
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname "*gall*"  -----> A
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname *gall*    -----> B
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$

Вывод, кажется, тот же самый. В каком случае они будут отличаться? Почему двойная кавычка не подавляет расширение подстановочного знака в A? У меня было впечатление, что A не сработает, а сработает только B.

решение1

В случае Б:

find . -iname *gall*

Theоболочкабудет развернут *gall*в список всех файлов, соответствующих этому шаблону. Поскольку в вашем текущем каталоге есть только один файл, соответствующий этому шаблону, это становится:

find . -iname gallifrey-road-doctors-14437-1366x768.jpg

...так что find будет искать файлы, соответствующие этому точному имени. foo-gallifrey-road-doctors-14437-1366x768.jpgне будет найден. Если у вас было два или более файлов, соответствующих glob, вы бы получили неправильно сформированную команду find; я почти уверен, что она бы просто завершилась с ошибкой.

В случае А:

find . -iname "*gall*"

Из-за кавычек оболочкане будетРасширьте шаблон. Это просто становится (это то, что findвидит):

find . -iname *gall*

После этого команда find использует этот шаблон для поиска всех файлов (и каталогов и т. д.), соответствующих этому шаблону. Это найдет gallifrey-road-doctors-14437-1366x768.jpgи foo-gallifrey-road-doctors-14437-1366x768.jpgи каждый файл, соответствующий шаблону *gall*.

Итак: ваша команда проходит через оболочку (которая не расширяет шаблоны внутри кавычек и удаляет внешний слой кавычек), изатемпроходит через find, который внутренне использует шаблон для сопоставления имен файлов.

Связанный контент