Я пишу скрипт, которому нужен канонический путь определенных команд. Поскольку могут быть символические ссылки, указывающие на реальные команды, я использую readlink -f
для получения канонического пути. Но я не получаю того, что я на самом деле хочу с помощью readlink -f
, я объясню на следующем примере:
Допустим, мой текущий каталог: /home/user/Documents
Если я попытаюсь получить путь к sleep
нему readlink -f
, то получу следующее:
/home/user/Documents/sleep
Чего я на самом деле хочу, так это/bin/sleep
решение1
readlink -f "$(type -P sleep)"
или если вы заботитесь о производительности:
cpath="$(type -P sleep)"; [ ! -L "$cpath" ] || cpath="$(readlink -f "$cpath")"
Использование readlink -e
(существующего) вместо readlink -f
может уберечь вас от подобных ситуаций, когда вы работаете с несуществующим файлом.
Во втором примере предполагается, что возвращаемый путь type -P
является каноническим, то есть предполагается, что ваш путь не содержит неканонических компонентов.