如何在 Mac OS X 上的 shell 脚本中检索绝对文件名?

如何在 Mac OS X 上的 shell 脚本中检索绝对文件名?

我想检索当前执行的脚本文件的绝对文件名。链接也应该被解析。

在 Linux 上,这似乎是像这样完成的:

$(readlink -mn "$0")

readlink似乎有效非常在 Mac OS X 上则有所不同。

我读到过这是使用

$(realpath $0)

在 BSD 中,但这也不起作用。Mac OS X 没有realpath

任何想法?

答案1

我作弊并使用 perl 来做这件事:

#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname

您可能认为我会用 perl 编写整个脚本,而且我经常这样做,但并非总是如此。

答案2

#!/usr/bin/env bash
scriptDir="$(cd "$(dirname "$0")" && pwd -P)"

答案3

它处理符号链接的组合,并且适用于文件和文件夹:

#!/usr/bin/env bash
realpath()
{
    if ! pushd $1 &> /dev/null; then 
        pushd ${1##*/} &> /dev/null
        echo $( pwd -P )/${1%/*}
    else
        pwd -P
    fi
    popd > /dev/null
}

但它不支持 realpath 的 --relative-to。这需要转换 描述在这里

答案4

另一种方法:

# Install.
brew install coreutils

# Use the GNU variant.
grealpath --help

相关内容