Вопрос или проблема
Когда я спросил в руководстве о команде “which”, я получил следующий ответ:
which возвращает пути к файлам (или ссылкам), которые будут
выполнены в
текущей среде, если его аргументы были бы переданы в командной строке в строго
соответствующей стандарту POSIX оболочке. Он делает это, ища в PATH исполняемые файлы,
соответствующие именам аргументов. Он не канонизирует имена путей.
Впервые слышу о “каноническом пути”. Я нашел четкое определение на stackoverflow
Здесь. Приведенные примеры следующие:
абсолютный путь: C:\abc..\abc\file.txt
канонический путь: C:\abc\file.txt
Не сложно увидеть разницу, но кто на практике использовал бы первый путь вместо второго? В чем смысл? Другими словами, в чем смысл использования пути, который не канонизирован?
PS: Я только что понял, что эти два примера для Windows; возможно, это не лучший выбор для моего вопроса.
Для меня есть один практический пример, когда путь + имя файла будет в неканонической форме.
Предположим, у вас есть две переменные A1
и B1
. Каждая из них содержит часть пути, но вторая имеет относительный (от чего-то) путь, другая имеет диск и директорию:
A1="C:\abc"
B1="..\abs\file.txt"
Чтобы получить полный путь, вы их конкатенируете и получаете:
C:\abc\..\abc\file.txt
P.S. Для Linux будет:
A1="/abs"
B1="../abc/file.txt"
P="$A1"/"$B1"
и результат:
/abc/../abc/file.txt
Ответ или решение
Конечно, существует несколько практических примеров работы с неканонизированными путями, которые могут быть полезны в различных ситуациях. В частности, такие пути могут применяться в сценариях, связанных с динамической генерацией файловых путей, особенно когда части путей формируются на основе пользовательского ввода или внешних условий.
Пример 1: Динамическая генерация путей
Рассмотрим сценарий, где у вас есть две переменные: A1
и B1
. Первая переменная содержит абсолютный путь, а вторая — относительный:
A1="C:\abc"
B1="..\abs\file.txt"
Если вы соедините эти две переменные, то получите следующий неканонизированный путь:
C:\abc\..\abs\file.txt
В этом примере ..\
обозначает переход на уровень выше по иерархии каталогов. Этот неканонизированный путь имеет смысл, когда вы работаете с временными строками путей, которые затем могут быть обработаны, или когда вы хотите сохранить оригинальные относительные ссылки для дальнейшей обработки.
Пример 2: Скрипты и автоматизация
При написании скриптов или автоматизации на Bash в Unix-подобных системах можно столкнуться с аналогичной ситуацией. Возьмите следующие переменные:
A1="/abs"
B1="../abc/file.txt"
P="$A1/$B1"
При таком объединении вы получите путь:
/abs/../abc/file.txt
Этот путь также неканонизирован. Использование неканонизированных путей может быть полезным в сценариях, когда необходимо передать относительные пути в другие функции или скрипты, которые могут понимать или обрабатывать такие пути.
Примечание о производительности и удобства
Канонизация путей чаще всего требуется для удобства и удобочитаемости. Однако в некоторых случаях, таких как разработка программного обеспечения или обработка файлов, вам может потребоваться передавать неканонизированные пути. Например, в функции, принимающей в качестве аргументов пути к файлам, вы можете захотеть оставить их в исходном виде для дальнейшей обработки или логирования, чтобы упростить отладку.
Заключение
Таким образом, использование неканонизированных путей может оказаться полезным в сценариях, где ваша программа работает с малыми модулями пути, динамически формируемыми на основе различных факторов или когда необходима передача оригинального формата пути для дальнейшей работы. Это позволяет гибко работать с файловой системой, не теряя контекста и относительных ссылок, которые могут быть важны в конкретных задачах.