Wie kann ich den absoluten Dateinamen in einem Shell-Skript unter Mac OS X abrufen?

Wie kann ich den absoluten Dateinamen in einem Shell-Skript unter Mac OS X abrufen?

Ich möchte den absoluten Dateinamen der aktuell ausgeführten Skriptdatei abrufen. Links sollten ebenfalls aufgelöst werden.

Unter Linux scheint dies folgendermaßen zu funktionieren:

$(readlink -mn "$0")

aber readlinkscheint zu funktionierensehranders unter Mac OS X.

Ich habe gelesen, dass dies geschieht mit

$(realpath $0)

in BSD, aber das funktioniert auch nicht. Mac OS X hat nicht realpath.

Irgendeine Idee?

Antwort1

Ich schummele und verwende Perl genau für Folgendes:

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

Man könnte meinen, ich würde das gesamte Skript einfach in Perl schreiben, und das tue ich oft, aber nicht immer.

Antwort2

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

Antwort3

Dies verarbeitet Kombinationen von symbolischen Links und funktioniert bei Dateien und Ordnern:

#!/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
}

Aber es unterstützt nicht realpath's --relative-to. Dies würde die Konvertierung erfordern hier beschrieben.

Antwort4

Ein anderer Ansatz:

# Install.
brew install coreutils

# Use the GNU variant.
grealpath --help

verwandte Informationen