配置に依存しないスクリプト

スクリプトがごちゃごちゃしてきたので

#!/bin/sh
VAR=ABC
echo $VAR
$ ./try.sh
ABC

bin、etc、(log、tmp、...)とディレクトリを分けたら、

$ tree try/
try/
-- bin
`-- try.sh
`-- etc `-- try.env $ cat try/etc/try.env VAR=ABC
binに移動しないとちゃんと動作しなくなったとか
#!/bin/sh
. ../etc/try.env

echo $VAR
$ ./try.sh
ABC
$ cd ..
$ ./bin/try.sh 
./bin/try.sh: line 2: ../etc/try.env: そのようなファイルやディレクトリはありません
配置を変えたらスクリプトも変えないといけなくなったとか
#!/bin/sh
SCRIPT_DIR=/home/mikeda/try
. $SCRIPT_DIR/etc/try.env

echo $VAR
$ ~/try/bin/try.sh
ABC
$ mv ~/try /tmp
$ /tmp/try/bin/try.sh
/tmp/try/bin/try.sh: line 3: /home/mikeda/try/etc/try.env: 
そのようなファイルやディレクトリはありません

そういうのはちょっとさみしい。



これは$0とdirnameを使えば対応できます。$0には0番目の引数、つまり実行スクリプトのパスが入ってるのでそれを使えばbinディレクトリの位置がわかるからです。

#!/bin/sh
cd `dirname $0`
. ../etc/try.env

echo $VAR
#!/bin/sh
SCRIPT_DIR=`dirname $0`/..
. $SCRIPT_DIR/etc/try.env

echo $VAR
$ ~/try/bin/try.sh
ABC
$ mv ~/try /tmp
$ /tmp/try/bin/try.sh 
ABC