Acho que isso não é apenas mais curto, mas também mais fácil de ler; YMMV.
path_to_script () {
if ! [ -L "$1" ]; then
echo "$1"
else
path_to_script "$(readlink "$1")"
fi
}
Estou procurando uma maneira de obter o verdadeiro caminho absoluto para o script /bin/sh
atual. Deve funcionar para situações como esta:
/path/to/symlink/in/PATH/somescript
-> ../../Package/current/bin/somescript.sh
... onde ../../Package/current
é um link simbólico que aponta para v1.23
.
Pressupostos importantes: supomos que readlink
esteja disponível, mas não tenha necessariamente a opção -f
.
Como o código de interesse está contido no arquivo do script, este código pode seguramente assumir que todos os links simbólicos são legítimos e, no final, apontam para o lugar certo (senão o código não teria sido encontrado pelo shell e executado no primeiro lugar). IOW, não há necessidade de se preocupar com ciclos de links simbólicos, links simbólicos quebrados, etc.
Abaixo, dou a minha melhor tentativa, mas parece-me um pouco exagerado. Existe uma maneira mais simples?
Aqui está minha versão:
path_to_script () {
TARGET="$1"
BASENAME="$(basename "$TARGET")"
(
cd -P "$(dirname "$TARGET")"
if [ -h "$BASENAME" ]
then
path_to_script "$(readlink "$BASENAME")"
else
echo "$PWD/$BASENAME"
fi
)
}
PATH_TO_SCRIPT="$(path_to_script "$0")"
Basicamente, ele segue recursivamente links simbólicos, usando cd -P
para resolver links simbólicos em caminhos.
Acho que isso não é apenas mais curto, mas também mais fácil de ler; YMMV.
path_to_script () {
if ! [ -L "$1" ]; then
echo "$1"
else
path_to_script "$(readlink "$1")"
fi
}
Tags bourne-shell shell-script dash