我一直在使用如下命令来获取执行特定脚本时的目录,无论它是从哪里执行的:
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")