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