6

Я использовал команду, подобную следующей, чтобы получить каталог определенного скрипта при его выполнении, независимо от того, откуда он был выполнен:

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

Каким будет аналогичный лайнер для получения канонического пути для каталога, который находится на два родительских элемента выше каталога скриптов? Я пробовал такие вещи, как:

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

Я не гуру Баш, как вы можете сказать. Как бы я это сделал?

2 ответа2

5

Вы должны дать /../.. до последней readlink , а не до dirname:

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

Ваш скрипт вызывает dirname path/to/script/../.. для выполнения выдает « path/to/script/.. », который readlink отказывается канонизировать, потому что такие конструкции, как file/.. , недопустимы в Linux, а опция -f требует существования всех компонентов. (readlink -m будет работать, так как он не проверяет наличие каких-либо компонентов пути.)

4

Для тех, у кого нет readlink (как я на 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")

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .