If --regex is not specified, PATTERNs can contain globbing characters. If any PATTERN contains no globbing characters, locate behaves as if the pattern were *PATTERN*.
Теперь см. Выход из этих команд:
test@ubuntu:~$ ls
Desktop Documents Downloads Firefox_wallpaper.png Music Pictures Public Templates Videos
test@ubuntu:~$
test@ubuntu:~$
test@ubuntu:~$ locate '/bin/bash*'
test@ubuntu:~$
test@ubuntu:~$
test@ubuntu:~$ locate /bin/bash*
/snap/core18/1880/bin/bash
/snap/core18/1880/usr/bin/bashbug
/snap/core18/1944/bin/bash
/snap/core18/1944/usr/bin/bashbug
/usr/bin/bash
/usr/bin/bashbug
Если вы увидите мой нынешний рабочий каталог не иметь файла / полный путь Имя начинается с / Bin / Bash
. Следовательно, мы не должны получать какие-либо продукции из на местах / бин / Bash *
. Почему ?
Согласно Hallbing Характеристика оболочки , поскольку у меня нет такого файла / каталога в моем текущем рабочем каталоге, следовательно, *
не будет расширено и передано как оно. Следовательно, это должно быть эквивалентно с использованием , найдите «/ bin / bash *»
(который является нашей 2-й командой, выполняется выше). С тех пор это не получает никаких выходов, поэтому это Найти / bin / bash *
не должно давать вывода?
Если вы видите, что моя настоящая рабочая директория не имеет файла/директории, чей полное имя пути начинается с /bin/bash. Следовательно, мы не должны получение любого вывода из locate /bin/bash*
Нет, так не работает shell globbing - /bin/bash*
совпадает с , включая путь, поэтому, учитывая, что он находит совпадение (т.е. /bin/bash
), это аргумент, который получит locate
. Вы можете проверить это, запустив команду с набором отладочных параметров shell'а -x
:
$ set -x
$
$ locate /bin/bash*
+ locate /bin/bash
/bin/bash
/snap/core/10577/bin/bash
/snap/core/10577/usr/bin/bashbug
/snap/core/10583/bin/bash
/snap/core/10583/usr/bin/bashbug
/snap/core18/1932/bin/bash
/snap/core18/1932/usr/bin/bashbug
/snap/core18/1944/bin/bash
/snap/core18/1944/usr/bin/bashbug
/usr/bin/bashbug
Так как (расширенный) шаблон не содержит глобусных символов, он эквивалентен */bin/bash*
.
Более интересный вопрос, почему он не находит сам /bin/bash
, учитывая, что оболочка, по-видимому, находит - я думаю, это потому, что /bin
имеет сим-ссылку на /usr/bin
на более новых версиях Ubuntu - и updateb
не записывает сим-ссылку.
Во-первых
Команда locate
совпадает с предоставленным образцом в его базе данных. Вот как это работает. Это означает две вещи:
Что бы вы ни пытались найти, оно должно быть в его базе данных и недостаточно того, что оно существует в вашей файловой системе. БД должна регулярно обновляться, но иногда на это требуется время, и команда для этого вручную - sudo updateb
Учитывая вышесказанное о том, как работает locate
, не имеет значения, из какой директории вы выполняете команду locate
, так как locate
сам по себе не ищет и даже не видит текущую директорию. Все, что он знает - это его БД.
Во-вторых
Когда вы передаете незащищенный (не цитируемый) образец , содержащий символы глобуса для поиска, образец не передается в locate
. То, что передается в locate
в данном случае - это расширенная версия, сделанная самой оболочкой, которая может содержать всевозможные вещи, которые после слов будут рассматриваться как несколько шаблонов с помощью locate
, и она будет сравнивать все это со своей базой данных и выводить на печать соответствующим образом. У вас нет надежного способа контролировать то, что передается в locate
в этом случае, и оболочка сама решает, что делать.
Надлежащий способ предотвратить вмешательство оболочки в шаблоны и их расширение с помощью глобусных символов в них - это защитить или избежать этих символов. Короче говоря, используйте кавычки либо одинарные, либо двойные вокруг шаблона, например:
locate '/bin/bash*'