シェルスクリプトやバッチファイルを書いていると、コマンドの中に相対パスで別のファイルを指定したりしてしまいます。
例えばシェルスクリプトと同じディレクトリにある"test.txt"というファイルを開くシェルスクリプトなら、単純に
とすればよいように思うかもしれません。
試しに、上記の内容を記述したファイルを/tmp/test.shとし、適当なテキストファイルを/tmp/test.txtとして用意し、
自身のホームディレクトリより
/tmp/test.sh
として実行するとどうなるでしょうか。
きっとエラーになるはずです。
これは、シェルスクリプトの中で実行されるコマンド(cat)が、ホームディレクトリのtest.txtというファイルを開こうとするからです。
シェルスクリプトと同じディレクトリにあるファイルを開こうとするなら、一度シェルスクリプトがあるディレクトリに移動し、終了後に戻るという操作が必要です。
これをシェルスクリプトで記述するなら以下のようになります。
また、バッチファイルなら以下のようになります。
私は、シェルスクリプトやバッチファイルを書くとき、とりあえず上記のコマンドをおまじないとして書くようにしています。
注意: ファイルパスをオプションとして指定するようなコマンドを作成するときは、上記の手法は使えません
例えばシェルスクリプトと同じディレクトリにある"test.txt"というファイルを開くシェルスクリプトなら、単純に
cat test.txt
とすればよいように思うかもしれません。
試しに、上記の内容を記述したファイルを/tmp/test.shとし、適当なテキストファイルを/tmp/test.txtとして用意し、
自身のホームディレクトリより
/tmp/test.sh
として実行するとどうなるでしょうか。
きっとエラーになるはずです。
これは、シェルスクリプトの中で実行されるコマンド(cat)が、ホームディレクトリのtest.txtというファイルを開こうとするからです。
シェルスクリプトと同じディレクトリにあるファイルを開こうとするなら、一度シェルスクリプトがあるディレクトリに移動し、終了後に戻るという操作が必要です。
これをシェルスクリプトで記述するなら以下のようになります。
pushd `dirname $0` > /dev/null
(実行するコマンド)
popd > /dev/null
また、バッチファイルなら以下のようになります。
@pushd %~dp0
(実行するコマンド)
@popd
私は、シェルスクリプトやバッチファイルを書くとき、とりあえず上記のコマンドをおまじないとして書くようにしています。
注意: ファイルパスをオプションとして指定するようなコマンドを作成するときは、上記の手法は使えません