Спробуйте наступні прості однолінійки:
Для всіх 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"
}
Пов'язані:
Дивись також:
Як я можу отримати поведінку зчитування GNU -f на Mac?