Попробуйте следующие простые однострочники:
Для всех UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
удар
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
Примечание. Двойная тире (-) используется в командах для обозначения конца параметров команды, поэтому файлы, содержащие тире или другие специальные символы, не нарушают команду.
Примечание: в Bash используйте ${BASH_SOURCE[0]}
в пользу $0
, иначе путь может прерваться при поиске ( source
/ .
).
Для Linux, Mac и других * BSD:
cd "$(dirname "$(realpath "$0")")";
Примечание: realpath
должен быть установлен в самом популярном дистрибутиве Linux по умолчанию (например, Ubuntu), но в некоторых он может отсутствовать, поэтому вы должны установить его.
Примечание: если вы используете Bash, используйте ${BASH_SOURCE[0]}
в пользу $0
, иначе путь может прерваться при поиске ( source
/ .
).
В противном случае вы можете попробовать что-то подобное (он будет использовать первый существующий инструмент):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Для Linux:
cd "$(dirname "$(readlink -f "$0")")"
Использование GNU readlink на * BSD / Mac:
cd "$(dirname "$(greadlink -f "$0")")"
Примечание: вам нужно coreutils
установить (например, 1. Установить Homebrew , 2. brew install coreutils
).
В баш
В bash вы можете использовать расширения параметров для достижения этой цели, например:
cd "${0%/*}"
но это не работает, если скрипт запускается из той же директории.
В качестве альтернативы вы можете определить следующую функцию в bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Эта функция принимает 1 аргумент. Если аргумент уже имеет абсолютный путь, выведите его как есть, в противном случае выведите $PWD
переменную + аргумент имени файла (без ./
префикса).
или вот версия, взятая из .bashrc
файла Debian :
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
Связанные с:
Смотрите также:
Как я могу получить поведение readlink -f GNU на Mac?