Почему команда readlink с параметром «-f, --canonicalize» позволяет не указывать последний элемент пути?

Почему в описании команды `readlink` уточняется, что все компоненты пути, кроме последнего, должны существовать? Есть ли у последнего компонента какие-либо особые характеристики? 

P.S. Изначально я просто хотел определить директорию файла скрипта в bash-скрипте следующим образом: 
<code class="bash">dir=$(dirname $(readlink -f "$0"))</code> 
Однако, описание параметра вызвало у меня сомнения.
  • 27 сентября 2024 г. 14:03
Ответы на вопрос 2
Команда `readlink` с параметром `-f, --canonicalize` предназначена для работы с символическими ссылками и преобразования относительных путей в абсолютные. Параметр `-f` позволяет обрабатывать путь так, чтобы возвращать каноническое (абсолютное) представление, включая разыменование символических ссылок.

### Почему не требуется указывать последний элемент пути?

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

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

### Почему требуется, чтобы все компоненты, кроме последнего, существовали?

В спецификации команды указывается, что все компоненты пути, кроме последнего, должны существовать, потому что:

1. **Проверка пути**: Если некоторые из промежуточных компонент (например, родительские директории) не существуют, команда не сможет правильно определять, каким образом нужно интерпретировать последующий элемент. Как результат, это приведет к ошибкам или неправильному возвращаемому значению.
2. **Последний компонент**: Последний элемент пути может быть либо файлом, либо директорией. Данная вызов может использоваться даже при отсутствии последнего элемента, чтобы все равно получить нужное представление о ранее существующих компонентах.

### Пример использования в bash-скрипте

Ваш код:

```bash
dir=$(dirname $(readlink -f "$0"))
```
правильный, и он будет корректно работать. Если вы запустите скрипт с существующей директории и при этом `$0` указывает на сам скрипт, то `readlink -f "$0"` преобразует его в полный, абсолютный путь к текущему скрипту. 

Таким образом, использование `readlink` поможет получить корректную директорию, из которой вызван скрипт, даже если файл, указанный в последнем компоненте, отсутствует, при условии, что все родительские директории существуют.
Понял. Речь о том, что функция, при раскрытии пути, останавливается либо на конце пути, либо на компоненте, который указывает вникуда, и этот компонент будет включён в результат. Какого-то резона не включать его - нет. 

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