Я хочу получить абсолютное имя файла сценария, который в данный момент выполняется. Ссылки тоже должны быть разрешены.
В Linux это выглядит так:
$(readlink -mn "$0")
но readlink
кажется работает очень иначе в Mac OS X.
Я читал, что это делается с помощью
$(realpath $0)
в BSD, но это тоже не работает. Mac OS X не имеет realpath
.
Любая идея?
#!/usr/bin/env bash
scriptDir="$(cd "$(dirname "$0")" && pwd -P)"
Я обманываю и использую perl именно для этого:
#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname
Вы могли подумать, что я просто напишу весь сценарий на Perl, и я часто это делаю, но не всегда.
Другой подход:
# Install.
brew install coreutils
# Use the GNU variant.
grealpath --help
Это обрабатывает комбинации символических ссылок и работает с файлами и папками:
#!/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
}
Но он не поддерживает --relative-to. Это потребует преобразования описано здесь.