Найдите команду и глобубируют раковину

из Найти страницу человека :

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 * не должно давать вывода?

3
задан 25 January 2021 в 22:15

2 ответа

Если вы видите, что моя настоящая рабочая директория не имеет файла/директории, чей полное имя пути начинается с /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 не записывает сим-ссылку.

5
ответ дан 18 March 2021 в 23:40

Во-первых

Команда locate совпадает с предоставленным образцом в его базе данных. Вот как это работает. Это означает две вещи:

  • Что бы вы ни пытались найти, оно должно быть в его базе данных и недостаточно того, что оно существует в вашей файловой системе. БД должна регулярно обновляться, но иногда на это требуется время, и команда для этого вручную - sudo updateb

  • Учитывая вышесказанное о том, как работает locate, не имеет значения, из какой директории вы выполняете команду locate, так как locate сам по себе не ищет и даже не видит текущую директорию. Все, что он знает - это его БД.

Во-вторых

Когда вы передаете незащищенный (не цитируемый) образец , содержащий символы глобуса для поиска, образец не передается в locate. То, что передается в locate в данном случае - это расширенная версия, сделанная самой оболочкой, которая может содержать всевозможные вещи, которые после слов будут рассматриваться как несколько шаблонов с помощью locate, и она будет сравнивать все это со своей базой данных и выводить на печать соответствующим образом. У вас нет надежного способа контролировать то, что передается в locate в этом случае, и оболочка сама решает, что делать.

Надлежащий способ предотвратить вмешательство оболочки в шаблоны и их расширение с помощью глобусных символов в них - это защитить или избежать этих символов. Короче говоря, используйте кавычки либо одинарные, либо двойные вокруг шаблона, например:

locate '/bin/bash*'
2
ответ дан 18 March 2021 в 23:40

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

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