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

Dav*_*ave 6 bash

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

MYDIR=$(dirname $(readlink -f $0))
Run Code Online (Sandbox Code Playgroud)

获取脚本目录上方两个父目录的规范路径的类似单行是什么?我试过这样的事情:

MYDIR=$(dirname $(readlink -f $0/../..))
MYDIR=$(readlink -f $(dirname $(readlink -f $0)/../..))
Run Code Online (Sandbox Code Playgroud)

正如您所知,我不是 bash 大师。我该怎么做?

use*_*686 5

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

$(readlink -f "$(dirname "$(readlink -f "$0")")/../..")
Run Code Online (Sandbox Code Playgroud)

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