7

重複の可能性:
bash スクリプトがそれ自体へのフル パスを取得する信頼できる方法は?

次の行test.shで別のスクリプトの関数を使用するbashスクリプトがあります。search.sh

source ../scripts/search.sh
<call some functions from search.sh>

どちらのスクリプトも git リポジトリにあります。ディレクトリsearch.sh内、同じディレクトリにあります(ただし、一般的に言えば、ディレクトリ内のどこにでも配置できます-つまり、次のアプローチに頼ることはできません)。<git_root>/scripts/test.sh<git_root>source search.sh

test.shすべてからスクリプトを呼び出すと<git_root>/scripts/うまくいきますが、現在の作業ディレクトリを変更するとすぐにtest.sh失敗します:

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

したがって、私が持っているもの:

  1. ディレクトリへのsearch.shスクリプトの相対パス<git_root>

私が欲しいもの:test.shエラーなしで内部のどこからでも実行できるようにする<git_root>こと。

PS:search.sh git リポジトリは任意の場所に複製できるため、永続的な絶対パスを使用することはできません。

4

4 に答える 4

3

両方のスクリプトが同じディレクトリにある場合、実行中のスクリプトがあるディレクトリを取得すると、それをディレクトリとして使用して他のスクリプトを呼び出します。

# 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

質問の受け入れられた回答から取得して、この質問を次の重複としてマークしました:https://stackoverflow.com/a/4774063/440558

于 2013-01-09T14:23:46.670 に答える
1

あなたはこれを行うことができます:

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

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

Git ルート ディレクトリを取得する方法

または、@Joachim Pileborg が言うように、このスクリプトから別のスクリプトへのパスを知っている必要があることに注意する必要があります。

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

Apache Tomcat スクリプトは、次のアプローチを使用します。

# 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"`

とにかく、他のスクリプトを使用するすべてのスクリプトにこのスニペットを配置する必要があります。

于 2013-01-09T14:53:23.910 に答える
1

この Git リポジトリの場所を特定する方法はありますか? 環境変数セット?PATHスクリプト自体に Git リポジトリを含めるように設定できます。

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

スクリプトが完了すると、PATHは古い値に戻り、$GIT_REPO_LOCATION/scriptsの一部ではなくなりますPATH

問題は、まずこの場所を見つけることです。スクリプトで次のようなことができると思います:

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

ちなみに、設定が完了したので、スクリプトディレクトリにいるときに必要だったのではなく$PATH、スクリプトを呼び出すことができます。現在のディレクトリは含まれていませんでした(PATHには含めないでください。セキュリティホールです)。search.sh./search.shPATH..

.gitもう1つ注意してください。探しているGitリポジトリである可能性のあるディレクトリも検索できます。

GIT_LOCATION=$(find $HOME -name ".git" -type d | head -1)
PATH="$GIT_LOCATION:$PATH"
. search.sh
于 2013-01-09T15:08:43.460 に答える