Предположим, у меня есть файл bash myBash.bash
. Он находится в:
/myDirect/myFolder/myBash.bash
Теперь я хочу использовать строку /myDirect/myFolder
(местоположение myBash.bash
) внутри скрипта. Есть ли команда, которую я могу использовать, чтобы найти это место?
Редактировать: Идея состоит в том, что я хочу создать zip-папку с кодом, который может быть запущен скриптом bash внутри этого zip-файла. Я знаю относительные пути к файлам кода внутри этого zip-файла, но не абсолютные пути, и они мне нужны. Одним из способов является жесткое кодирование пути или требование указания пути к файлу в качестве переменной. Однако мне было бы проще, если бы bash-файл мог сам определить, где он находится, а затем создать соответствующие пути к другому файлу из его знания структуры zip-файла.
источник
Ответы:
Вы можете получить полный путь как:
И, как указал Сергей, вы можете использовать,
dirname
чтобы убрать имя файла, как этоили даже лучше, чтобы предотвратить неуклюжие цитирование и расщепление слов со сложными именами файлов:
Намного лучше, чем моя более ранняя идея, которая заключалась в том, чтобы разобрать ее (я знал, что будет лучший способ!)
Примечания
realpath
возвращает фактический путь к файлу$0
это файл (скрипт)s|old|new|
заменитьold
наnew
\(.*\)/
сохранить любые символы раньше/
на потом\1
сохраненная частьисточник
$0
иsed
магию. Но сказанноеsed
волшебство действительно не нужно, когда такие инструментыdirname
существуютrealpath
:realpath "$( dirname $0 )"
лично я бы использовал,readlink
но это я:readlink -e $(dirname $0)
dirname "$(realpath "$0")"
лучше? Обычно требуется знать родительский каталог ссылочного файла вместо родительского каталога символической ссылки, ссылающейся на указанный файл."$(dirname "$(realpath "$0")")"
- самый простой способ. Кавычки внутри$()
работают как обычно.$()
получить кавычки снаружи. Я бы не сказал, что это так просто, если только не осознаешь$()
, что все подшкурыесли скрипт находится на вашем пути, вы можете использовать что-то вроде
РЕДАКТИРОВАТЬ: после прочтения комментариев от Serg, это может быть универсальное решение, которое работает вне зависимости от того, находится скрипт в вашем пути или нет.
источник
which
больше подходит для случаев, когда скрипт находится в одном из каталогов, которые являются частьюPATH
переменной. Используйте$0
из сценария, как показывает Занна. Но ваш ответ правильный, так как вы используетеdirname
вместо того, чтобы возитьсяsed
, поэтому +1 для этогоПринятый ответ кажется идеальным. Вот еще один способ сделать это:
/bin/pwd
печатает реальный путь к каталогу, в отличие отpwd
встроенной команды.источник
Он взят в качестве эталона из kenorb и андро
Нет, readlink имя папки, Realpath, BASH_SOURCE
Все это встроенные команды
источник