Как получить абсолютное имя файла в скрипте оболочки в 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

Связанный контент