Mac OS X のシェル スクリプトで絶対ファイル名を取得するにはどうすればよいですか?

Mac OS X のシェル スクリプトで絶対ファイル名を取得するにはどうすればよいですか?

現在実行されているスクリプト ファイルの絶対ファイル名を取得したいと思います。リンクも解決する必要があります。

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

関連情報