2016年9月25日日曜日

シェルスクリプトで、スクリプトファイルのあるディレクトリに移動する

今回は小ネタです。

シェルスクリプト実行時、スクリプトファイルのあるディレクトリを基準に作業したいことってありますよね。ありますよね?
そんなときに手抜きするとハマりますよ、という体験談です。

ハイ、今書いてるスクリプトでハマったのでメモしてるだけです。

「今更かよ」とか言わない。

まちがい

よくやるのがコレ。
# スクリプトファイルの場所に移動
cd `dirname ${0}`
簡単ですが、これが使えるのはスクリプトの先頭で呼ぶ一度だけです。
一度だけ移動して、あとは全てこの中で作業or相対ディレクトリで移動するなら問題ありません。

でも、いろいろ動きまわった後でもう一度戻るときにこれを使うとハマります。
# スクリプトファイルの場所に移動
cd `dirname ${0}`

# いろいろ移動して
cd ...
cd ...
cd ...

# 別の処理のために仕切りなおし(できない!)
cd `dirname ${0}`
ほらね。
スクリプトファイルを相対パスで指定すると`dirname ${0}`も相対パスになるので、仕切りなおしできませんよという話です。
大抵相対パスで指定しますよね? ./script.sh とか bash path/to/script.sh とか。

せいかい

これが正解。
# スクリプトファイルの場所に移動して
cd `dirname ${0}`

# 現時点の絶対パスを保存
ROOT=`pwd`

# いろいろ移動して
cd ...
cd ...
cd ...

# 別の処理のために仕切りなおし(できた!)
cd ${ROOT}
最初に絶対パス保存しときゃいいんじゃね?ってだけです。

0 件のコメント:

コメントを投稿