Получить канонический путь для команды

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

Предположим, что мой текущий каталог: /home/user/Documents Если я попытаюсь получить путь sleep с помощью readlink -f я получаю следующее:

 /home/user/Documents/sleep 

То, что я действительно хочу, это /bin/sleep

 readlink -f "$(type -P sleep)" 

или если вы осознаете свою эффективность:

 cpath="$(type -P sleep)"; [ ! -L "$cpath" ] || cpath="$(readlink -f "$cpath")" 

Использование readlink -e (существующего) вместо readlink -f может спасти вас от такого рода несчастных случаев, когда вы работаете с несуществующим файлом.

Второй пример предполагает, что путь, возвращаемый type -P является каноническим, что означает, что он предполагает, что ваш путь не имеет неканонических компонентов.