Я вважаю, що краще пізно, ніж ніколи. Мене мотивували спеціально розробити це, оскільки мої сценарії Fedora не працювали на Mac. Проблема - залежності і Баш. Маки не мають їх, або, якщо вони є, вони часто є деінде (інший шлях). Маніпулювання траєкторією залежності в крос-платформному сценарії Bash - це головний біль у кращому випадку та ризик для безпеки в гіршому випадку, тому краще уникати їх використання, якщо це можливо.
Наведена нижче функція get_realpath () проста, орієнтована на Баш, і не потрібно ніяких залежностей. Я використовую лише Bash buildins echo та cd . Він також досить безпечний, оскільки все тестується на кожному етапі шляху і він повертає умови помилок.
Якщо ви не хочете слідувати за посиланнями, то поставте set -P в передній частині сценарію, але в іншому випадку cd повинен вирішити символьні посилання за замовчуванням. Це перевірено аргументами файлів, які є абсолютними відносний | symlink | local} і повертає абсолютний шлях до файлу. Поки у нас з цим проблем не було.
function get_realpath() {
if [[ -f "$1" ]]
then
# file *must* exist
if cd "$(echo "${1%/*}")" &>/dev/null
then
# file *may* not be local
# exception is ./file.ext
# try 'cd .; cd -;' *works!*
local tmppwd="$PWD"
cd - &>/dev/null
else
# file *must* be local
local tmppwd="$PWD"
fi
else
# file *cannot* exist
return 1 # failure
fi
# reassemble realpath
echo "$tmppwd"/"${1##*/}"
return 0 # success
}
Ви можете комбінувати це з іншими функціями get_dirname, get_filename, get_stemname та validate_path. Їх можна знайти в нашому сховищі GitHub як realpath-lib (повне розкриття - це наш продукт, але ми пропонуємо його безкоштовно для громади без будь-яких обмежень). Він також може слугувати інструктивним інструментом - він добре документований.
Ми намагалися застосовувати так звані «сучасні баш-практики», але Баш - це велика тема, і я впевнений, що завжди буде можливість для вдосконалення. Він вимагає Bash 4+, але він може бути змушений працювати з більш старими версіями, якщо вони все ще існують.
readlink
може бути вбудована або зовнішня команда.