web-dev-qa-db-ja.com

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

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

Linuxでは、これは次のように行われるようです。

$(readlink -mn "$0")

しかし、readlinkは動作するようですvery Mac OS Xでは動作が異なります。

これは以下を使用して行われることを読みました

$(realpath $0)

bSDではそれも機能しません。 Mac OS Xにはrealpathがありません。

何か案が?

19
Huxi

私は、まさにこのことのために、Perlをだまして使用します。

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

私はスクリプト全体をPerlで書くだけだと思いますが、いつもそうとは限りません。

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

別のアプローチ:

# Install.
brew install coreutils

# Use the GNU variant.
grealpath --help
0
FMc

これはシンボリックリンクのコンボを処理し、ファイルとフォルダーで機能します:

#!/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をサポートしていません。これには、変換 ここで説明 が必要です。

0
Oliver