bash путь к скрипту

Bash путь к скрипту

Иногда нужно знать, в каком каталоге находится запущенный скрипт. Ну, например, в этом же каталоге лежат другие скрипты, которые должны быть запущены текущим выполняющемся скриптом. Для того, чтобы он их запустил, ему было бы неплохо знать, где их искать, потому что вы могли запустить скрипт находясь в совершенно произвольной директории, или воспользоваться для запуска не самим файлом скрипта, а символической ссылкой, лежащей в другом каталоге, которая указывает на файл скрипта.

Можно, конечно, поступить просто и в самом скрипте в переменной жёстко прописать полный путь до каталога, в котором этот скрипт лежит. Получится что-то вроде этого:
Вполне рабочий вариант и две обозначенные выше проблемы будут решены, но если надо будет переместить скрипт в другой каталог, то и значение переменной придётся руками поменять в самом скрипте. Не очень удобно.

13 комментариев:

bash путь к скрипту

А если не воспользовались для запуска символической ссылкой?
Да и к чему городить огород.
Проще так:
DIRSCRIPT=$(pwd) # Текущая директория
echo «$«

bash путь к скрипту

Поправка.. Короче, разобрался. Все это туфта и то и другое.
Вот универсальное отличное решение, особенно, если учитывать, что во фряхе нет «readlink»..

И запускайте скрипт как хотите..

bash путь к скрипту

> А если не воспользовались для запуска символической ссылкой?
Отработает всё совершенно корректно

А вы уверены, что называть туфтой решение в котором вы так и не разобрались хорошая идея?

> во фряхе нет «readlink»
Где я писал что это должно работать во фрибсд? Прочитайте название блога и сообщения.
Я не использую фрибсд, но позволю себе поинтересоваться, а какой интерпретатор команд вы используете в ней? На сколько мне известно, по умолчанию там tcsh или csh, а совсем не bash.

> И запускайте скрипт как хотите
Да что вы? Оукей. Тогда создайте символьную ссылку на свой скрипт в другом каталоге (не в том в котором лежит скрипт), войдите в этот каталог и выполните симлинк. Сильно удивитесь. Ваше решение вернет путь до каталога, в котором находится симлинк, вместо каталога в котором находится сам скрипт. Надеюсь доступно объяснил.

А еще поясните, пожалуйста, чем решение из двух команд, приведенное мной, «огороднее» вашего решения из трёх команд? Кроме того, переход в каталог для того что бы узнать путь до него немножко попахивает костылем, вам так не кажется? Но это я уже придираюсь, конечно, т. к. в баше без костылей никуда.

Источник

Как в Bash узнать абсолютный путь до файла

Что такое абсолютный и относительный пути

Абсолютный путь содержит полный перечень папок, в которых находится файл, начиная от корня файловой системы.

Пример абсолютного пути: /home/mial/bin/myfile.txt

Преимущество абсолютного пути в том, что используя его можно обратиться к файлу из любой папки системы.

Относительный путь указывает на расположение файла относительно текущей папки. Примеры относительных путей:

Преимущество относительного пути в том, что обычно он обозначается более короткой записью как например myfile.txt — означает одноимённый файл в текущей папке. Очевидно, что при смене рабочей директории относительный путь до файла станет другим.

В этой заметке будут рассмотрены несколько примеров того, как определить абсолютный путь до файла в текущей рабочей директории или любой другой, когда путь до файла указан как относительный путь.

realpath

Первый вариант — использовать команду realpath:

Привет вывода абсолютного пути:

bash путь к скрипту

Эта программа является частью coreutils.

По умолчанию эта программа преобразует символические ссылки (опция -P) и показывает расположение файла даже если он не существует (опция -m) — то есть эти опции указывать необязательно.

Фактически, по умолчанию работа программы сводится к тому, что к указанному аргументу она добавляет текущую рабочую папку, то есть можно узнать абсолютный путь даже до файла, который не существует:

Если вас это не устраивает, то используйте опцию -e — тогда если указанный файл не существует, то вместо вывода абсолютного пути будет показано сообщение об ошибке.

readlink

Аналогичную функцию выполняет и команда readlink.

Если вы хотите показать абсолютный путь только для существующих файлов, то используйте опцию -e:

Если вас не волнует, существует ли файл, то используйте опцию -f (не требует существование последнего компонента) или опцию -m (не требует существование какого-либо компонента пути):

realpath и readlink не найдены

UNIX системы — это не только многочисленные дистрибутивы Linux. В некоторых из них команды realpath и readlink могут отсутствовать. Если они отсутствуют и вы не хотите или не можете устанавливать дополнительные бинарные файлы, то выход всё равно есть.

Создайте файл, например, realpath.sh и скопируйте в него:

Этот же вариант в виде функции:

Вот эта же функция в продвинутом варианте — дополнительно обрабатывает ситуацию, когда директория не существует, а также если во вводе присутствуют ‘..’ или ‘.’

Ещё один вариант в виде функции оболочки, который:

И ещё одна функция, записанная в одну строку и работающая в bash и zsh (другие не проверялись):

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

bash полный путь до скрипта

Модератор: /dev/random

bash полный путь до скрипта

Сообщение Aleman » 30.05.2008 06:12

Re: bash полный путь до скрипта

Сообщение un-defined » 30.05.2008 08:01

bash путь к скрипту

Re: bash полный путь до скрипта

Сообщение SLEDopit » 30.05.2008 08:58

Re: bash полный путь до скрипта

Сообщение pcodr » 30.05.2008 09:00

Re: bash полный путь до скрипта

Сообщение Aleman » 30.05.2008 10:26

Re: bash полный путь до скрипта

Сообщение arch » 30.05.2008 10:48

Re: bash полный путь до скрипта

Сообщение pcodr » 30.05.2008 10:53

arch, немного глючит если запускать указывая полный путь до скрипта,

Re: bash полный путь до скрипта

Сообщение Aleman » 30.05.2008 11:31

bash путь к скрипту

Re: bash полный путь до скрипта

Сообщение /dev/random » 30.05.2008 15:57

Re: bash полный путь до скрипта

Сообщение pcodr » 30.05.2008 18:01

Я проникся этим вопросом и изготовил новую версию, оцените bash путь к скрипту

Re: bash полный путь до скрипта

Сообщение Aleman » 30.05.2008 18:20

bash путь к скрипту

Re: bash полный путь до скрипта

Сообщение /dev/random » 30.05.2008 23:58

bash путь к скрипту

Re: bash полный путь до скрипта

Сообщение /dev/random » 31.05.2008 00:55

Re: bash полный путь до скрипта

Сообщение Aleman » 01.06.2008 01:29

Источник

Надежный способ для скрипта bash получить полный путь к себе? [дубликат]

этот вопрос уже есть ответ здесь:

у меня есть скрипт bash, который должен знать свой полный путь. Я пытаюсь найти широко-совместимый способ сделать это, не заканчивая с относительной или симпатичный пути. Мне нужно только поддержка bash, не sh, csh и т. д.

что я нашел до сих пор:

на readlink решение на этой странице, который выглядит так:

но readlink не POSIX и, по-видимому, решение зависит от GNU readlink где BSD не будет работать по какой-то причине (у меня нет доступа к BSD-подобной системе для проверять.)

Итак, различные способы сделать это, но у всех есть свои предостережения.

что было бы лучшим способом? Где «лучше» означает:

23 ответов

вот что я придумал (edit: плюс некоторые настройки, предоставляемые sfstewman, levigroker, Кайл Сумка и Роб Кеннеди), это, кажется, в основном соответствует моим» лучшим » критериям:

Это SCRIPTPATH линия кажется особенно Окольной, но нам она нужна, а не SCRIPTPATH=`pwd` для правильной обработки пробелов и символических ссылок.

обратите внимание также, что эзотерические ситуации, такие как выполнение сценария, который не исходящий из файла в доступной файловой системе вообще (что вполне возможно), не обслуживается там (или в любом из других ответов, которые я видел).

Я удивлен, что realpath команда здесь не упоминается. Насколько я понимаю, он широко переносится / портируется.

ваше начальное решение становится:

и оставить символические ссылки неразрешенными в соответствии с вашими предпочтениями:

самый простой способ, который я нашел, чтобы получить полный канонический путь в bash является использование cd и pwd :

Мне просто нужно было вернуться к этой проблеме сегодня и найти https://stackoverflow.com/a/246128/1034080. Он разрабатывает решение, которое я использовал в прошлом, а также.

в связанном ответе есть больше вариантов, например, для случая, когда сам скрипт является символической ссылкой.

получить абсолютный путь скрипта

поддерживает

я ищу угловые случаи, когда этот код не работает. Пожалуйста, дайте мне знать.

известный issuse

скрипт должно быть где-то на диске пусть будет по сети. если вы попытаетесь запустить этот скрипт из трубы, он не будет работать

Технически говоря, это не определено.
Практически говоря, нет никакого разумного способа обнаружить это. (co-process не может получить доступ к env родителя)

dirname удаляет суффикс без каталога из имени файла

следовательно, вы получаете полный путь к скрипту, независимо от того, был ли указан путь или нет.

поскольку realpath не установлен по умолчанию в моей системе Linux, для меня работает следующее:

перед использованием этого читать комментарии ответ.

отвечая на этот вопрос слишком поздно, но я использую:

мы разместили наш собственный продукт realpath-lib на GitHub для свободного и свободного использования сообщества.

бесстыдный плагин, но с этой библиотекой Bash вы можете:

эта функция является ядром библиотеки:

Update: после некоторого обзора и тестирования мы заменили вышеуказанную функцию чем-то, что достигает того же результата (без использования dirname, только pure Bash), но с лучшей эффективностью:

это также включает в себя параметр среды no_symlinks это обеспечивает возможность разрешения символических ссылок на физическую систему. По умолчанию он сохраняет символические ссылки нетронутый.

вы можете попытаться определить следующую переменную:

или вы можете попробовать следующую функцию в bash:

Источник

Получение исходного каталога скрипта Bash изнутри

Как получить путь к каталогу, в котором Баш сценарий находится, внутри этот скрипт?

например, предположим, я хочу использовать скрипт Bash в качестве запуска для другого приложения. Я хочу изменить рабочий каталог на тот, где находится скрипт Bash, чтобы я мог работать с файлами в этом каталоге, например:

30 ответов

является полезным однострочным, который даст вам полное имя каталога скрипта независимо от того, откуда он вызывается.

он будет работать до тех пор, пока последний компонент пути, используемый для поиска скрипта, не является символической ссылкой (ссылки каталога в порядке). Если вы также хотите разрешить любые ссылки на сам скрипт, вам нужно многострочное решение:

чтобы понять, как это работает, попробуйте запустить этот более подробном виде:

и он напечатает что-то вроде:

используя pwd один не будет работать, если вы не запускаете скрипт из каталога, в котором он содержится.

некоторые другие упомянули более ранних версий команда, но в самом простом виде вы можете использовать:

readlink разрешит путь скрипта к абсолютному пути от корня файловой системы. Таким образом, любые пути, содержащие одиночные или двойные точки, Тильды и/или символические ссылки, будут разрешены до полного пути.

вот сценарий, демонстрирующий каждый из них, whatdir.sh:

запуск этого скрипта в моем домашнем каталоге, используя относительный путь:

снова, но используя полный путь к скрипту:

теперь изменение каталогов:

и, наконец, используя символическую ссылку, чтобы выполнить скрипт:

работает для всех версий,в том числе

альтернативно, если сценарий bash сам относительная ссылка вы хочу чтобы следовать за ним и вернуть полный путь связанного скрипта:

SCRIPT_PATH дается в полном пути, независимо от того, как он называется.
Просто убедитесь, что вы нашли это в начале сценария.

этот комментарий и код Copyleft, выбираемая лицензия под GPL2.0 или более поздней версии или CC-SA 3.0 (CreativeCommons Share Alike) или более поздней версии. c) 2008 год. Все права защищены. Никаких гарантий. Вы были warned.
http://www.gnu.org/licenses/gpl-2.0.txt
http://creativecommons.org/licenses/by-sa/3.0/
18eedfe1c99df68dc94d4a94712a71aaa8e1e9e36cacf421b9463dd2bbaa02906d0d6656

обратите внимание, что вы должны использовать #!/ bin / bash, а не #!/bin / sh с его расширением bash

Это должно сделать это:

работает с символическими ссылками и пробелами в path. Видеть страницах dirname и более ранних версий.

из комментария, похоже, не работает с Mac OS. Понятия не имею почему. Есть предложения?

, dirname дает точно часть каталога имени файла, которая, скорее всего, будет относительно текущего рабочего каталога. Если вашему скрипту по какой-то причине нужно изменить каталог, то вывод из dirname становиться бессмысленным.

Я предлагаю следующее:

таким образом, вы получите абсолютный, а не относительный путь.

поскольку скрипт будет запущен в отдельном экземпляре bash, нет необходимости восстанавливать рабочий каталог после этого, но если вы по какой-то причине хотите вернуться в свой скрипт, вы можете легко назначить значение pwd в переменную перед изменением каталога для дальнейшего использования.

решает конкретный сценарий в вопросе, я считаю, что абсолютный путь более полезен в целом.

это получает текущий рабочий каталог на Mac OS X 10.6.6:

это специально для Linux, но вы можете использовать:

вот POSIX совместимый однострочный:

Я пробовал каждый из них, и ни один из них не работал. Один был очень близко, но имел крошечный жучок, который сломал его плохо; они забыли обернуть путь в кавычки.

также многие люди предполагают, что вы запускаете скрипт из оболочки, поэтому забудьте, когда вы открываете новый скрипт, он по умолчанию используется в вашем доме.

попробуйте этот каталог для размера:

/ var / No one / Thought/About Spaces Being/in a Directory/Name / и вот ваш файл.текст

это получает правильно, независимо от того, как и где вы его запускаете.

поэтому, чтобы сделать его действительно полезным, вот как перейти в каталог запущенного скрипта:

надеюсь, что это поможет

Я бы использовал что-то вроде этого:

небольшое изменение решения e-satis и 3bcdnlklvc04a указано в ответ

Это должно работать во всех случаях, которые они перечислили.

EDIT: предотвращение popd после неудачного pushd, благодаря konsolebox

вот простой, правильный путь:

и конечно dirname получает родительский каталог путь.

обратите внимание, что это должен быть первый оператор в вашем скрипте.

я сравнил многие из приведенных ответов и придумал несколько более компактных решений. Они, кажется, обрабатывать все сумасшедшие случаи края, которые возникают из вашей любимой комбинации:

если вы работаете с Linux, кажется, что с помощью proc handle-лучшее решение для поиска полностью разрешенного источника текущего запущенного скрипта (в интерактивном сеансе ссылка указывает на соответствующий /dev/pts/X ):

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *