Получение полного пути к файлу с помощью “readlink -f” не работает на OSX?

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

На Linux (redhat/ubuntu/что угодно) я могу сделать это:

$readlink -f myfile.txt
/tmp/local/path/to/myfile.txt

На OSX (yosemite):

$ readlink -f eclipse-projects.xml 
readlink: недопустимый параметр -- f

Может ли кто-то объяснить, в чем дело?
Каков “эквивалент” -f на osx?
(И почему людям так нравится делать вещи такими непоследовательными?!)

# Вернуть канонизированный путь (работает на OS-X как 'readlink -f' на Linux); . это $PWD
function realpath {
    [ "." = "${1}" ] && n=${PWD} || n=${1}; while nn=$( readlink -n "$n" ); do n=$nn; done; echo "$n"
}

Ответ или решение

На операционных системах Linux команда readlink -f используется для получения полного пути к файлу, что позволяет обойти символические ссылки и получить конечный путь. Однако на macOS (включая Yosemite) такая команда не поддерживается, и использование параметра -f вызывает ошибку.

Причина этой различия в реализации утилиты readlink в разных операционных системах. В macOS утилита readlink не имеет опции -f, что может быть источником путаницы для пользователей, привыкших к Linux.

Для получения полного пути к файлу в macOS вы можете использовать встроенную команду realpath. Если она недоступна (что бывает не всегда), можно воспользоваться следующим скриптом, который можно сохранить в файл и вызвать, передавая ему имя файла как аргумент:

# Функция для получения канонического пути (аналогично 'readlink -f' в Linux)
function realpath {
    [ "." = "${1}" ] && n=${PWD} || n=${1}
    while nn=$(readlink -n "$n"); do n=$nn; done
    echo "$n"
}

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

Чтобы использовать эту функцию, выполните следующие шаги:

  1. Откройте терминал.
  2. Создайте новый файл, например, с именем realpath.sh, и вставьте туда указанный выше код.
  3. Сделайте файл исполняемым с помощью команды: chmod +x realpath.sh.
  4. Вы можете запустить скрипт с помощью: ./realpath.sh your_file.txt.

Если у вас есть Homebrew, вы также можете установить утилиту coreutils, которая содержит версию readlink с параметром -f:

brew install coreutils

После установки, вы сможете использовать greadlink -f вместо readlink -f для получения абсолютного пути.

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

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

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