Попробуйте следующие простые однострочечники:
Для всех UNIX/OSX/Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Примечание: двойное тире (-) используется в командах для означают окончание параметров команды, поэтому файлы, содержащие тире или другие специальные символы, не будут нарушать команду.
для Linux, Mac и другого * BSD:
cd $(dirname $(realpath $0))
С пробелами поддержка:
cd "$(dirname "$(realpath "$0")")";
Примечание: realpath
должны быть установлены в наиболее популярном дистрибутиве Linux по умолчанию (например, Ubuntu), но в некоторых он может отсутствовать, поэтому вам нужно его установить.
В противном случае вы можете попробовать что-то подобное (он будет использовать первый существующий инструмент):
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
).
В Баш
В Баш вы можете использовать Parameter Expansions для достижения этой цели, как:
cd ${0%/*}
, но он не работает, если скрипт выполняется из того же каталога.
В качестве альтернативы вы можете определить следующую функцию в Баш:
realpath() {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Эта функция принимает 1 аргумент. Если аргумент имеет уже абсолютный путь, напечатайте его как есть, в противном случае напечатайте аргумент переменной + имя файла $PWD
(без префикса ./
).
или вот версия взята из Debian .bashrc
файла:
function realpath()
{
[email protected]
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
Похожие:
Смотрите также:
How can I get the behavior of GNU's readlink -f on a Mac?
Вы считали, что где-то, как/usr/bin, записываете сценарий оболочки в каталог (hardcoded), а затем выполняете свой скрипт? –
Зачем вам нужен каталог скрипта? Вероятно, есть лучший способ решить основную проблему. – bstpierre
Я хотел бы указать, что поведение, которое вы называете «явно нежелательным», на самом деле абсолютно необходимо - если я запускаю «путь myscript/to/file», я ожидаю, что скрипт будет оценивать путь/в/файл относительно MY текущий каталог, а не какой-либо каталог, в котором находится скрипт. Кроме того, что бы вы сделали для сценария, запущенного с помощью 'ssh remotehost bash <./myscript', как упоминается в FAQ BASH? –