Расширение пути файла включает родительский и текущий каталоги?

Вопрос или проблема

Я читал несколько предупреждений о использовании шаблона .* при использовании глоббинга, так как он будет включать текущие и родительские директории.

Я пробовал 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-профессионалам более подробный контроль над системой. Стабильность в управлении файловыми системами – важный аспект при работе с критическими системами, где каждое действие может повлиять на целостность данных.

Таким образом, в современном контексте управления операционной системой, знания о расширении файловых систем являются ключевыми для понимания того, каким образом эффективно и безопасно взаимодействовать с системой, обеспечивая надёжность и доступность данных.

Оцените материал
Добавить комментарий

Капча загружается...