Вопрос или проблема
Я читал несколько предупреждений о использовании шаблона .*
при использовании глоббинга, так как он будет включать текущие и родительские директории.
Я пробовал echo .*
и с ls -l .*
, и мой bash расширяет только до скрытых файлов в текущей директории. Поскольку это ответственность bash выполнять расширение файловых путей, я предполагаю, что это будет работать одинаково для всех других команд.
Возможно, это была проблема только в более ранних версиях Bash… Однако я не нашел никакой информации в этом смысле.
Что не так в моем мышлении?
В версии Bash 5.2 была введена новая опция оболочки globskipdots
, как указано в заметках о выпуске:
aa. Новая опция оболочки `globskipdots' заставляет расширение пути никогда не возвращать `.' или `..' если они не указаны явно. Она включена по умолчанию.
Чтобы восстановить “старое” поведение, вы можете отключить опцию с помощью встроенной команды shopt
:
shopt -u globskipdots
Смотрите также Какое значение в bash управляет тем, чтобы * включал файлы с точкой.
Ответ или решение
Расширение файловой системы – это процесс, используемый при работе с командной строкой, который позволяет автоматически подставлять соответствующие имена файлов и директорий вместо шаблонов. Часто это происходит с помощью символов подстановки, например, *
и ?
. Однако, работа с такими символами, как .*
, может вызвать проблемы, связанные с включением текущих .
и родительских ..
директив в результаты.
Теория
Базовым элементом в понимании расширения файловой системы является её реакция на символы подстановки. Символы подстановки позволяют пользователю задавать шаблоны, которые будут соответствовать одному или более файлам либо директориям. В контексте Unix-подобных систем, где подстановки обрабатываются оболочкой (shell), такая как bash, это особенно важно.
Когда в оболочке используется паттерн .*
, он в большинстве случаев подставит все скрытые файлы в текущей директории. В скрытом режиме в Unix-подобных системах файлы, имена которых начинаются с точки (.
), считаются скрытыми. В ранних версиях bash использование .*
вызывало расширение также и на текущую (.
) и родительскую (..
) директории.
Пример
Рассмотрим команду ls -l .*
, введенная в bash. В ранних версиях bash это привело бы к расширению, содержащему текущую и родительскую директорию вместе с остальными скрытыми файлами. Однако, начиная с версии bash 5.2, было введено улучшение, предотвращающее автоматическую подстановку для .
и ..
. Это усовершенствование получило название globskipdots
.
Применение
Как следствие, в современной версии bash 5.2 и выше, заданный по умолчанию параметр globskipdots
избегает включения текущей и родительской директории в результаты расширения, что повышает безопасность и облегчает работу с файлами в командной строке. Чтобы вернуться к старой модели поведения, при необходимости, можно отключить эту опцию с помощью команды:
shopt -u globskipdots
После выполнения этой команды вывод команды ls -l .*
снова включит в себя текущую и родительскую директории, таким образом подтверждая, что .
, ..
и другие скрытые файлы обрабатываются как однотипные элементы.
Заключение
С обновлением bash, применение параметров подстановки стало более предсказуемым и безопасным. Это делает процесс обработки файлов и директив более ясным и позволяет избежать нежелательных результатов, таких как копирование или изменение содержимого более высокого уровня директорий, что могло бы привести к непредсказуемым последствиям особенно в сложных автоматизированных скриптах.
Понимание того, как bash обрабатывает специальный контекст через globskipdots
, и как можно влиять на это поведение, даёт IT-профессионалам более подробный контроль над системой. Стабильность в управлении файловыми системами – важный аспект при работе с критическими системами, где каждое действие может повлиять на целостность данных.
Таким образом, в современном контексте управления операционной системой, знания о расширении файловых систем являются ключевыми для понимания того, каким образом эффективно и безопасно взаимодействовать с системой, обеспечивая надёжность и доступность данных.