Отримати канонічне значення відносного шляху від скрипта bash


6

Я використовую команду, подібну до наведеної нижче, щоб отримати каталог певного сценарію, коли він виконується, незалежно від того, де він був виконаний з:

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

Яким буде схожий один лайнер, щоб отримати канонічний шлях до каталогу, який є двома батьками над каталогом сценаріїв? Я спробував такі речі, як:

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

Я не баш гуру, як ви можете сказати. Як я можу це зробити?

Відповіді:


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")

Я думаю, ви, можливо, забули прив'язати це до відповіді на питання. Це акуратна обгортка для повороту pwd однак у щось більше. Дуже unixy =)
Eroen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.