Вопрос или проблема
На 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
, позволяя вам получать абсолютный путь к файлу, обходя любые символьные ссылки.
Чтобы использовать эту функцию, выполните следующие шаги:
- Откройте терминал.
- Создайте новый файл, например, с именем
realpath.sh
, и вставьте туда указанный выше код. - Сделайте файл исполняемым с помощью команды:
chmod +x realpath.sh
. - Вы можете запустить скрипт с помощью:
./realpath.sh your_file.txt
.
Если у вас есть Homebrew, вы также можете установить утилиту coreutils
, которая содержит версию readlink
с параметром -f
:
brew install coreutils
После установки, вы сможете использовать greadlink -f
вместо readlink -f
для получения абсолютного пути.
Таким образом, несмотря на несоответствия между системами, существуют альтернативные способы получения полного пути к файлу в macOS.