Исходный сценарий удара к другому

Возможный Дубликат:
Надежный путь к сценарию удара, чтобы получить полный путь к себе?

У меня есть сценарий удара test.sh , которые используют функции от другого search.sh сценарий следующими линиями:

source ../scripts/search.sh

Both scripts are located in git repository. search.sh in /scripts/ directory, test.sh is located in the same directory (but, generally speaking, could be located anywhere inside directory - I mean I can't rely on the following source search.sh approach ).

When I call test.sh script from /scripts/ everything works well, but as soon as I change current working directory test.sh fails:

cd /scripts/
./test.sh         //OK
cd ..
./scripts/test.sh //FAILS
./scripts/test.sh: line 1: ../scripts/search.sh: No file or directory ...

Таким образом, что я имею:

  1. Relative path of search.sh script towards directory

What I want: To have ability to run test.sh from anywhere inside without errors.

P.S.: It is not possible to use permanent absolute path to search.sh as git repository can be cloned to any location.

6
nl ja de
Это не двойное. Я попробовал методы от этой связи. Но it' s не мой случай, поскольку здесь я не должен получать путь моего test.sh сценарий.
добавлено автор likern, источник
Возможно, I' m заявление очевидного, но если вы в настоящее время источник относительный путь из текущего каталога, поставляя относительный путь от script' s путь походит на хорошее улучшение. Единственное осложнение состоит в том, если бы пользователь перемещает сценарий в различное местоположение в целом, но я не могу вообразить, как вы зафиксировали бы это, кроме с переменной окружения.
добавлено автор tripleee, источник
Если search.sh сценарий будет в том же самом справочнике как test.sh , то нахождение пути, который test.sh находится в, совершенно определенно поможет, поскольку тогда вы используете тот путь, чтобы найти ваш другой сценарий.
добавлено автор Some programmer dude, источник

4 ответы

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

# Get the directory this script is in
pushd `dirname $0` > /dev/null
SCRIPTPATH=`pwd -P`
popd > /dev/null

# Now use that directory to call the other script
source $SCRIPTPATH/search.sh

Taken from the accepted answer of the question I marked this question a duplicatre of: https://stackoverflow.com/a/4774063/440558

3
добавлено
Кажется намного легче сделать $ SCRIPTPATH= (readlink-f 0$)
добавлено автор William Pursell, источник

Есть ли способ определить это местоположение хранилища Мерзавца? Переменная окружения установлена? Вы могли установить ПУТЬ в самом сценарии, чтобы включать хранилище Мерзавца:

 PATH="$GIT_REPO_LOCATION/scripts:$PATH"
 . search.sh

Как только сценарий полон, ваш ПУТЬ вернется к его старой стоимости и <коду>, $GIT_REPO_LOCATION/scripts больше не будет частью ПУТЬ .

Вопрос находит это местоположение для начала. Я предполагаю, что вы могли сделать что-то вроде этого в своем сценарии:

GIT_LOCATION=$(find $HOME -name "search.sh" | head -1)
GIT_SCRIPT_DIR=$(dirname $GIT_LOCATION)
PATH="$GIT_SCRIPT_DIR:$PATH"
. search.sh

Между прочим, теперь, когда , $PATH установлен, я могу назвать сценарий с помощью search.sh и не ./search.sh , который необходимо было сделать, когда вы были в справочнике сценариев, и ваш ПУТЬ не включал . , который является текущим каталогом (и ПУТЬ не должен включать . , потому что это - дыра в системе безопасности).

Еще одно примечание, вы могли искать каталог .git также, который мог бы быть хранилищем Мерзавца, которое вы ищете:

GIT_LOCATION=$(find $HOME -name ".git" -type d | head -1)
PATH="$GIT_LOCATION:$PATH"
. search.sh
1
добавлено
@user966467 Хорошо, как делают вас , знают, где то хранилище Мерзавца расположено? Однако, вы находите местоположение того хранилища Мерзавца, you' ll должны сообщить вашей программе.
добавлено автор David W., источник
Спасибо @sigmavirus24 зафиксировано
добавлено автор David W., источник
Я предполагаю, что могу использовать meta.stackexchange.com/questions/14237207/… который был упомянут @Joachim Pileborg.
добавлено автор likern, источник
По этим причинам я упростил задачу. И даже для этого can' t находят надежный подход;)
добавлено автор likern, источник
Но как избежать проблем с подобными хранилищами мерзавца. Нет никакой гарантии, что кто-то действительно клона мерзавца <связь> first-git-repo и затем клон мерзавца <связь> second-git-repo . Также в общем случае это решение может занять слишком много времени для поиска этого хранилища мерзавца. Также в общем случае мы должны использовать не только $HOME директор, но и / (корень) директор.
добавлено автор likern, источник
You' ре, пропускающее закрывающую скобку на второй линии второго кодового блока.
добавлено автор Ian Stapleton Cordasco, источник

Вы могли сделать это:

# Get path the Git repo
GIT_ROOT=`git rev-parse --show-toplevel`

# Load the search functions
source $GIT_ROOT/scripts/search.sh

How get Git root directory!

Или как @Joachim Пилеборг говорит, но необходимо обратить внимание, что необходимо знать путь этого к другому сценарию;

# Call the other script
source $SCRIPTPATH/../scripts/search.sh
# Or if it is in another path
source $SCRIPTPATH/../scripts/seachers/search.sh

Апачские сценарии Кота используют этот подход:

# resolve links - $0 may be a softlink
PRG="$0"

while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done

PRGDIR=`dirname "$PRG"`

Любым путем необходимо поместить этот отрывок во все сценарии, которые используют другие сценарии.

1
добавлено
Что, если пользователь isn' t в самом хранилище Мерзавца? Есть ли способ найти локальный репозиторий Мерзавца?
добавлено автор David W., источник
@sigmavirus24 я взял его от OP, который справочник он использует, может быть за пределами самого хранилища Мерзавца. Например, he' s в $HOME/ мусорное ведро , но Мерзавец repo находится в $HOME/ work/ git_repo .
добавлено автор David W., источник
Делает любой другой путь, не используя функции мерзавца как в надежном коде, я должен использовать проверку существования мерзавец команда. Я имею в виду в каждом новом сценарии, я должен использовать некоторый дублированный код: проверьте мерзавца , существование, добираясь GIT_ROOT и т.д...
добавлено автор likern, источник
От OP: Оба сценария расположен в хранилище мерзавца. ... , Что я хочу: иметь способность управлять test.sh отовсюду внутри без ошибок.
добавлено автор Ian Stapleton Cordasco, источник
@DavidW. самый надежный способ найти локальный репозиторий Мерзавца состоит в том, чтобы переместиться вверх в структуру каталогов, пока вы не находите .git справочник или поражаете некоторый определенный справочник, например, $HOME , / , и т.д.
добавлено автор Ian Stapleton Cordasco, источник
@user966467, можно сделать как апачский Кот Сценариев (startup.sh, catalina.sh...)-> отрывок
добавлено автор Rodrigo Catto, источник
@user966467, Если вы клонируете своего Мерзавца repo вы, сделали, чтобы мерзавец командовал, простой это!
добавлено автор Rodrigo Catto, источник

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

git_root=""
while /bin/true ; do
    if [[ "$(pwd)" == "$HOME" ]] || [[ "$(pwd)" == "/" ]] ; then
        break
    fi

    if [[ -d ".git" ]] ; then
        git_root="$(pwd)"
        break
    fi

    cd ..
done

Я не проверил это, но это просто образует петли назад, пока это не поразит ваш корневой каталог или/и это будет видеть, есть ли .git справочник в каждом родительском каталоге. Если есть, это устанавливает git_root переменная, и это вспыхнет. Если это не найдет один, <то код> git_root просто будет пустая строка. Тогда можно сделать:

if [[ -n "$git_root" ]] ; then
    . ${git_root}/scripts/search.sh
fi

IHTH

0
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.