从 bash 脚本获取相对路径的规范值

从 bash 脚本获取相对路径的规范值

我一直在使用如下命令来获取执行特定脚本时的目录,无论它是从哪里执行的:

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

有什么类似的方法可以获取脚本目录上方两个父目录的规范路径?我尝试过类似的事情:

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

您可能已经知道,我并不是一名 Bash 专家。我该怎么做呢?

答案1

你需要给予/../..最后一个readlink,而不是dirname

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

您的脚本导致dirname path/to/script/../..执行,输出“ path/to/script/..”,它readlink拒绝规范化,因为诸如的构造file/..在 Linux 中无效,并且该-f选项要求所有组件都存在。(readlink -m会起作用,因为它不检查任何路径组件是否存在。)

答案2

对于那些没有 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")

相关内容