readlink

Что делает команда readlink в Linux

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

В базовом виде команда выглядит просто:

Bash
readlink symlink_name

Если файл symlink_name указывает на другой путь, то в терминале будет показано его значение. Например:

Bash
ln -s /usr/local/bin/python3 /usr/bin/python
readlink /usr/bin/python

Результат:

Bash
/usr/local/bin/python3

Это пример того, как команда readlink в Linux помогает точно определить назначение символьной ссылки.

Совет: если вы часто работаете с симлинками в системных скриптах, используйте readlink вместе с параметром -f, чтобы всегда получать полный путь к файлу

Основные параметры команды readlink в Linux

Команда readlink в Linux поддерживает несколько параметров, которые позволяют гибко управлять выводом.

Параметр -f (или —canonicalize)

Параметр -f используется для вывода канонического пути, то есть полного абсолютного пути к файлу или директории, без относительных ссылок и символических переходов.
Пример:

Bash
readlink -f /usr/bin/python

Результат может быть таким:

Bash
/usr/local/bin/python3.10

Это особенно полезно, когда вы хотите узнать конечный реальный путь, а не только первый уровень символической ссылки.

Совет: при написании bash-скриптов для установки программ лучше использовать readlink -f "$0" — это поможет получить абсолютный путь к самому скрипту, независимо от того, где он запущен.

Параметр -e (или —canonicalize-existing)

Если использовать -e, команда readlink в Linux возвращает полный путь только в случае, если все компоненты пути существуют. Это помогает избежать ошибок при обращении к несуществующим файлам.
Пример:

Bash
readlink -e /tmp/nonexistent

Если файл отсутствует, команда не выведет ничего и вернёт ненулевой код выхода.

Параметр -m (или —canonicalize-missing)

Опция -m похожа на -f, но в отличие от неё, не требует, чтобы все части пути реально существовали. Она может использоваться для вычисления пути, даже если некоторые директории ещё не созданы.
Пример:

Bash
readlink -m /home/user/newfolder/file.txt

Даже если newfolder отсутствует, команда вернёт ожидаемый путь /home/user/newfolder/file.txt.

Параметр -n (или —no-newline)

По умолчанию команда добавляет символ новой строки в конце вывода. Если вы хотите использовать результат команды readlink в Linux в одной строке, например, в скриптах, применяйте флаг -n.

Bash
readlink -n symlink

Это удобно, когда вывод команды передаётся другой программе или используется в условии.

Параметр -v (или —verbose)

Параметр -v включает подробный вывод. Команда readlink в Linux покажет не только результат, но и дополнительную информацию о процессе разрешения символической ссылки.

Bash
readlink -v /usr/bin/python

Это бывает полезно при отладке сложных цепочек ссылок.

Параметр -q (или —quiet)

Этот параметр отключает сообщения об ошибках. При работе с большим количеством ссылок, где некоторые могут быть повреждены, -q помогает избежать лишнего шума в выводе.

Bash
readlink -q /path/to/link

Команда просто пропустит несуществующие пути.

Примеры практического использования команды readlink в Linux

Чтобы лучше понять, как применять команду readlink в Linux на практике, рассмотрим несколько примеров.

Пример 1: Получение пути исполняемого файла

Допустим, вы хотите узнать, где находится бинарный файл, связанный с командой bash.

Bash
readlink -f $(which bash)

Вы получите полный путь, например /usr/bin/bash. Это помогает убедиться, какой именно файл используется в текущей системе.

Пример 2: Использование в bash-скриптах

Внутри скриптов команда readlink в Linux часто применяется для определения собственного расположения:

Bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "Скрипт находится в: $SCRIPT_DIR"

Это удобно при копировании или запуске скриптов из разных директорий.

Пример 3: Проверка целостности символических ссылок

Если нужно быстро проверить, не “сломаны” ли ссылки, можно использовать цикл:

Bash
for link in $(find /usr/bin -type l); do
    if ! readlink -e "$link" > /dev/null; then
        echo "Битая ссылка: $link"
    fi
done

Этот подход помогает системным администраторам находить повреждённые симлинки в системе.

Пример 4: Комбинация readlink с другими утилитами

Команда readlink в Linux часто используется вместе с find, xargs, awk или sed. Например, чтобы вывести все ссылки и их реальные пути:

Bash
find /etc -type l -print0 | xargs -0 -n1 readlink -f

Это позволяет быстро просмотреть всю структуру симлинков в системе.

Дополнительные технические детали

Команда readlink в Linux является частью пакета GNU coreutils, что делает её доступной практически во всех дистрибутивах: Ubuntu, Debian, CentOS, Fedora и других. Она работает с системными вызовами readlink() и realpath(), которые напрямую обращаются к файловой системе.

Коды возврата команды:

  • 0 — успешное выполнение,
  • 1 — ошибка при чтении ссылки,
  • 2 — некорректные аргументы.

Если нужно проверить успешность выполнения:

Bash
if readlink -f /usr/bin/python > /dev/null; then
    echo "Ссылка работает"
else
    echo "Ошибка при чтении"
fi

Когда стоит использовать команду readlink

  1. При разработке системных скриптов, где требуется знать точное местоположение исполняемых файлов.
  2. При диагностике путей, когда симлинки ведут через несколько уровней.
  3. При настройке окружений и контейнеров, где важно понимать, какие реальные файлы используются внутри образов.
Совет: если вы работаете в среде Docker или WSL, проверяйте пути через readlink -f — это помогает избежать путаницы между относительными путями внутри контейнера и на хосте.

Таким образом, команда readlink в Linux — это мощный инструмент для анализа и управления символическими ссылками. Она незаменима при написании автоматизационных сценариев, администрировании систем и отладке сложных структур файлов. Зная ключевые параметры (-f, -e, -m, -n, -v, -q), можно гибко адаптировать вывод под любые задачи.