Obtém o valor canônico do caminho relativo do script bash

6

Eu tenho usado um comando como o seguinte para obter o diretório de um script em particular quando ele é executado, independentemente de onde ele foi executado:

MYDIR=$(dirname $(readlink -f $0))

O que seria um liner semelhante para obter o caminho canônico para o diretório que é dois pais acima do diretório de script? Eu tentei coisas como:

MYDIR=$(dirname $(readlink -f $0/../..))
MYDIR=$(readlink -f $(dirname $(readlink -f $0)/../..))

Eu não sou um guru, como você pode dizer. Como eu faria isso?

    
por Dave 05.12.2011 / 15:20

2 respostas

5

Você precisa atribuir /../.. ao último readlink , e não dirname :

$(readlink -f "$(dirname "$(readlink -f "$0")")/../..")

Seu script faz com que dirname path/to/script/../.. seja executado, exibindo " path/to/script/.. ", que readlink se recusa a canonizar porque construções como file/.. são inválidas no Linux e a opção -f requer a existência de todos os componentes. ( readlink -m funcionaria, pois não verifica a existência de nenhum componente do caminho.)

    
por 05.12.2011 / 15:45
4

Para quem não tem readlink (como eu no git bash)

#!/bin/bash

function canonicalPath
{
    local path="$1" ; shift
    if [ -d "$path" ]
    then
        echo "$(cd "$path" ; pwd)"
    else
        local b=$(basename "$path")
        local p=$(dirname "$path")
        echo "$(cd "$p" ; pwd)/$b"
    fi
}

# usage example
mycanonicalpath=$(canonicalPath "$myrelativepath")
    
por 13.09.2012 / 17:43

Tags