Команда `readlink` с параметром `-f, --canonicalize` предназначена для работы с символическими ссылками и преобразования относительных путей в абсолютные. Параметр `-f` позволяет обрабатывать путь так, чтобы возвращать каноническое (абсолютное) представление, включая разыменование символических ссылок.
### Почему не требуется указывать последний элемент пути?
Когда вы используете `readlink -f`, вы можете не указывать последний элемент пути, поскольку команда обрабатывает полный путь, substrating все компоненты, и может работать с любыми правильными компонентами пути, даже если последний компонент не существует. Это связано с тем, что:
1. `readlink` сначала разрешает все символические ссылки и разбивает путь на его компоненты.
2. Но последний элемент пути может быть ссылкой на файл, которого нет на диске. Команда может все равно вернуть каноническое представление всех существующих компонентов до последнего элемента, игнорируя, существует ли последний файл/каталог.
### Почему требуется, чтобы все компоненты, кроме последнего, существовали?
В спецификации команды указывается, что все компоненты пути, кроме последнего, должны существовать, потому что:
1. **Проверка пути**: Если некоторые из промежуточных компонент (например, родительские директории) не существуют, команда не сможет правильно определять, каким образом нужно интерпретировать последующий элемент. Как результат, это приведет к ошибкам или неправильному возвращаемому значению.
2. **Последний компонент**: Последний элемент пути может быть либо файлом, либо директорией. Данная вызов может использоваться даже при отсутствии последнего элемента, чтобы все равно получить нужное представление о ранее существующих компонентах.
### Пример использования в bash-скрипте
Ваш код:
```bash
dir=$(dirname $(readlink -f "$0"))
```
правильный, и он будет корректно работать. Если вы запустите скрипт с существующей директории и при этом `$0` указывает на сам скрипт, то `readlink -f "$0"` преобразует его в полный, абсолютный путь к текущему скрипту.
Таким образом, использование `readlink` поможет получить корректную директорию, из которой вызван скрипт, даже если файл, указанный в последнем компоненте, отсутствует, при условии, что все родительские директории существуют.