シェルスクリプト(Bashスクリプト)内でスクリプト自身が置かれているディレクトリを取得する方法を紹介します。
以下のように記述すれば、変数DIRにスクリプトが置かれているディレクトリがフルパスで代入されます。
DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )
「BASH_SOURCE[0]」には、スクリプトのパスが入っています。ただし、絶対パスか相対パスかは、呼ばれ方によります。
そのため、dirnameコマンドでディレクトリを取得し、そのディレクトリにcdしてからpwdコマンドを実行することで、絶対パスを取得しています。
なお、cdとdirnameのオプションに「—」をつけているのは、「–」で始まるディレクトリであった場合にエラーとしないためです。
ただし、上記の方法では対象のスクリプトやディレクトリがシンボリックリンクであった場合も解決されず、そのまま出力されます。
スクリプトがシンボリックリンクであった場合も、リンク先の実体ではなくシンボリックリンクが存在するディレクトリが出力されますし、ディレクトリの絶対パス内にシンボリックがあってもそのまま出力されます。
シンボリックリンクではなく実体のパスを取得したい場合、以下のように記述します。
DIR="$( dirname -- $( realpath -- "${BASH_SOURCE[0]}" ) )"
こちらの方法では、「realpath」コマンドで実体のパスを取得してから、dirnameでディレクトリ名を取得しています。
最近のLinux環境なら、大抵realpathコマンドが使えますが、使えない場合は最初の例に「-P」オプションを追加して以下のように記述すれば、ディレクトリのシンボリックリンクは解決できます(スクリプトがシンボリックリンクの場合、この方法では解決できません)。
DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd -P )
なお、実際にスクリプトで用いる場合、念のためDIRに代入されたディレクトリが存在するかをチェックしてから処理を進めるべきでしょう。
コメント