Obtendo o caminho absoluto real do script em / bin / sh

3

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.

    
por kjo 14.06.2016 / 19:07

1 resposta

0

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
}
    
por 02.10.2016 / 10:09