次の問題があります。私のシェルスクリプトには、次の内容が含まれています。
mydir=''
# config load
source $mydir/config.sh
.... execute various commands
私のスクリプトは私のユーザーディレクトリにあります。/home/bob/script.sh
私が/home/bob
ディレクトリ内にいて実行すると、./script.sh
すべてがうまくいきます。
外部にあり、絶対パスを使用しようとすると、/home/bob/script.sh
config.shファイルが正しく呼び出されません。
$mydir
各パスでスクリプトを簡単に実行するには、どの値を割り当てる必要がありますか?
mydir=$(which command?)
PS:ボーナスとしてスクリプトディレクトリが$ PATH内にある場合は、代替手段を提供してください。
答え1
この$0
変数にはスクリプトパスが含まれています。
$ cat ~/bin/foo.sh
#!/bin/sh
echo $0
$ ./bin/foo.sh
./bin/foo.sh
$ foo.sh
/home/terdon/bin/foo.sh
$ cd ~/bin
$ foo.sh
./foo.sh
ご覧のとおり、出力は呼び出し方法によって異なりますが、常にスクリプトの実行方法に関連するスクリプトパスを返します。だからあなたはこれを行うことができます:
## Set mydir to the directory containing the script
## The ${var%pattern} format will remove the shortest match of
## pattern from the end of the string. Here, it will remove the
## script's name,. leaving only the directory.
mydir="${0%/*}"
# config load
source "$mydir"/config.sh
ディレクトリがあなたのディレクトリにある場合、$PATH
状況はより簡単になります。実行できますsource config.sh
。デフォルトでは、source
ディレクトリからファイルを検索し、見つかった$PATH
最初のファイルをインポートします。
$ help source
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
あなたのコンテンツが一意であると確信したり、少なくともでconfig.sh
最初に見つかったコンテンツであれば、$PATH
そのコンテンツを入手できます。ただし、この方法を使用するのではなく、最初の方法に固執することをお勧めします。いつ他の人がconfig.sh
あなたのために現れるのかわかりません$PATH
。
答え2
この方法はただ以下で役に立つバッシュスクリプト。
使用:
mydir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
仕組み:
BASH_SOURCE
FUNCNAME
配列変数に対応するシェル関数名を定義するソースファイル名がメンバーである配列変数。
したがって、次を使用します。
cd "$( dirname "${BASH_SOURCE[0]}" )"
スクリプトが配置されているディレクトリに移動します。
その後、の出力cd
がに送信されます/dev/null
。なぜなら、STDOUTに何かを印刷するからです。たとえば、次のような$CDPATH
場合.
最後に、次を実行します。
pwd
現在位置を取得します。
源泉:
答え3
解決策が見つかりました。
mydir=$(dirname "$0")
これにより、どこでも問題なくスクリプトを呼び出すことができます。
答え4
この試みテスト済みです。そして検証済み住宅検査解決策:
mydir="$(dirname "${0}")"
source "${mydir}"/config.sh
printf "read value of config_var is %s\n" "${config_var}"
テストを受ける:
$ ls
script.sh
config.sh
$ cat script.sh
#!/bin/bash --
mydir="$(dirname "${0}")"
source "${mydir}"/config.sh
printf "read value of config_var is %s\n" "${config_var}"
$ cat config.sh
config_var=super_value
$ mkdir "$(printf "\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\40\41\42\43\44\45\46\47testdir" "")"
$ mv *.sh *testdir
$ *testdir/script.sh
read value of config_var is super_value