Я пишу сценарий Bash. Мне нужен текущий рабочий каталог, чтобы всегда быть каталогом, в котором находится скрипт.
Поведение по умолчанию состоит в том, что текущий рабочий каталог в скрипте - это оболочка, из которой я его запускаю, но я не хочу этого поведения.
myscript path/to/file
я ожидаю, что скрипт оценит путь / к / файлу относительно моего текущего каталога, а не того каталога, в котором происходит скрипт находиться в. Кроме того, что бы вы сделали, если бы скрипт запускался,ssh remotehost bash < ./myscript
как упоминается в BASH FAQ?cd "${BASH_SOURCE%/*}" || exit
Ответы:
источник
$0
. В вашем скрипте вы можете ожидать, например,../../
ссылки на каталог на два уровня выше местоположения скрипта, но это не обязательно так, если символические ссылки находятся в игре../script
,.
это правильный каталог, и его изменение.
также приведет к тому, что каталогscript
находится, то есть в текущем рабочем каталоге.bash script.sh
, то значение$0
isscript.sh
. Единственный способ, которымcd
команда будет «работать» для вас, это то, что вам не нужны неудачные команды. Если бы вы использовалиset -o errexit
(aka:),set -e
чтобы убедиться, что ваш сценарий не проходит мимо неудачных команд, это НЕ будет работать, потому чтоcd script.sh
это ошибка. Надежный [специфичный для bash] способcd "$(dirname ${BASH_SOURCE[0]})"
Следующее также работает:
Синтаксис подробно описан в этом ответе StackOverflow.
источник
bash script.sh
-$0
просто будет имя файлаПопробуйте следующие простые однострочники:
Для всех UNIX / OSX / Linux
удар
Примечание. Двойная тире (-) используется в командах для обозначения конца параметров команды, поэтому файлы, содержащие тире или другие специальные символы, не нарушают команду.
Примечание: в Bash используйте
${BASH_SOURCE[0]}
в пользу$0
, иначе путь может прерваться при поиске (source
/.
).Для Linux, Mac и других * BSD:
Примечание:
realpath
должен быть установлен в самом популярном дистрибутиве Linux по умолчанию (например, Ubuntu), но в некоторых он может отсутствовать, поэтому вы должны установить его.Примечание: если вы используете Bash, используйте
${BASH_SOURCE[0]}
в пользу$0
, иначе путь может прерваться при поиске (source
/.
).В противном случае вы можете попробовать что-то подобное (он будет использовать первый существующий инструмент):
Для Linux:
Использование GNU readlink на * BSD / Mac:
Примечание: вам нужно
coreutils
установить (например, 1. Установить Homebrew , 2.brew install coreutils
).В баш
В bash вы можете использовать расширения параметров для достижения этой цели, например:
но это не работает, если скрипт запускается из той же директории.
В качестве альтернативы вы можете определить следующую функцию в bash:
Эта функция принимает 1 аргумент. Если аргумент уже имеет абсолютный путь, выведите его как есть, в противном случае выведите
$PWD
переменную + аргумент имени файла (без./
префикса).или вот версия, взятая из
.bashrc
файла Debian :Связанные с:
Как определить текущий каталог, в котором я запускаю свой скрипт оболочки?
Получить исходный каталог скрипта Bash из самого скрипта
Абсолютный путь скрипта Bash с OS X
Надежный способ для скрипта Bash получить полный путь к себе
Смотрите также:
Как я могу получить поведение readlink -f GNU на Mac?
источник
cp
команде, @kenorb?--
) используется в командах для обозначения конца параметров команды, поэтому файлы, содержащие тире или другие специальные символы, не нарушают команду. Попробуйте, например, создать файл с помощьюtouch "-test"
иtouch -- -test
, затем удалите файл с помощьюrm "-test"
иrm -- -test
, и увидите разницу.realpath
пакет Debian устарел, а не GNUrealpath
. Если вы думаете, что это не ясно, вы можете предложить изменить.Это просто. Оно работает.
источник
cd "${BASH_SOURCE%/*}" || exit
Принятый ответ хорошо работает для сценариев, которые не были символическими ссылками в других местах, например, в
$PATH
.Однако, если скрипт запускается через символическую ссылку,
Это перейдет в
~/bin/
каталог, а не в~/project/
каталог, что, вероятно, сломает ваш скрипт, если цельюcd
является включение зависимостей относительно~/project/
Безопасный ответ по символической ссылке ниже:
readlink -f
требуется для определения абсолютного пути к файлу, который может содержать символические ссылки.Кавычки необходимы для поддержки файловых путей, которые потенциально могут содержать пробелы (плохая практика, но небезопасно предполагать, что это не так)
источник
Этот скрипт, кажется, работает для меня:
Командная строка pwd отражает местоположение скрипта как текущего рабочего каталога, независимо от того, откуда я его запускаю.
источник
realpath
вряд ли будет установлен везде. Что может не иметь значения, в зависимости от ситуации ОП.realpath
но есть,readlink
что похоже.Получить реальный путь к вашему сценарию
(Это ответ на тот же мой вопрос здесь: получить имя каталога, в котором выполняется скрипт )
источник
источник
PWD - это переменная окружения.
источник
Если вам просто нужно распечатать текущий рабочий каталог, то вы можете следовать этому.
Дать разрешение на выполнение:
Затем выполните сценарий,
./test
после чего вы сможете увидеть текущий рабочий каталог.источник
pwd
? Похоже, много потерянных нажатий клавиш для меня.