Как установить текущий рабочий каталог скрипта?
Я пишу bash-скрипт. Мне нужно, чтобы текущий рабочий каталог всегда был каталогом, в котором находится скрипт.
поведение по умолчанию заключается в том, что текущий рабочий каталог в скрипте-это оболочка, из которой я его запускаю, но я не хочу этого поведения.
10 ответов
попробуйте следующие простые выражения:
для всех UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "")" && pwd -P)
Примечание: двойная тире ( -- ) используется в командах для обозначения конца параметров команды, поэтому файлы, содержащие тире или другие специальные символы, не нарушат команду.
для Linux, Mac и других *BSD:
cd $(dirname $(realpath ))
С поддержкой пробелов:
cd "$(dirname "$(realpath "")")";
Примечание.: realpath
должен быть установлен в самом популярном дистрибутиве Linux по умолчанию (например, Ubuntu), но в некоторых он может отсутствовать, поэтому вам придется установить его.
в противном случае вы могли бы попробовать что-то подобное (он будет использовать существующий инструмент):
cd $(dirname $(readlink -f || realpath ))
для Linux specific:
cd $(dirname $(readlink -f ))
использование GNU readlink на *BSD / Mac:
cd $(dirname $(greadlink -f ))
Примечание: Вы должны иметь coreutils
установленные
(например, 1. Установить доморощенного, 2. brew install coreutils
).
в bash
в bash, вы можете использовать Разложений Параметра чтобы достичь этого, например:
cd ${0%/*}
но это не работает, если скрипт запускается из той же директории.
в качестве альтернативы вы можете определить следующую функцию в bash:
realpath () {
[[ = /* ]] && echo "" || echo "$PWD/${1#./}"
}
эта функция принимает 1 аргумент. Если аргумент уже имеет абсолютный путь, распечатайте его как есть, иначе print $PWD
переменная + аргумент filename (без ./
префикс).
или вот версия, взятая из 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"
}
по теме:
как определить текущий каталог, в котором я запускаю сценарий оболочки?
надежный способ для сценария bash получить полный путь к себе?
Читайте также:
этот скрипт, кажется, работает для меня:
#!/bin/bash
mypath=`realpath `
cd `dirname $mypath`
pwd
командная строка pwd повторяет местоположение скрипта как текущий рабочий каталог независимо от того, где я его запускаю.
принятый ответ хорошо работает для скриптов, которые не были символически связаны в другом месте, например в $PATH
.
#!/bin/bash
cd "$(dirname "")"
однако, если скрипт запускается через символическую ссылку,
ln -sv ~/project/script.sh ~/bin/;
~/bin/script.sh
это будет cd в
сделать реальный путь к вашему скрипту
if [ -L ] ; then
ME=$(readlink )
else
ME=
fi
DIR=$(dirname $ME)
(Это ответ на такой же мой вопрос здесь: получить имя каталога, в котором выполняется скрипт)
Если вам просто нужно распечатать настоящий рабочий каталог, вы можете следовать этому.
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
дать разрешение на выполнение:
chmod u+x test
затем выполните сценарий по ./test
затем вы можете увидеть настоящий рабочий каталог.