シェルスクリプトの基礎 - パスの取得
概要
ここでは、シェルスクリプトで相対パスと絶対パスを取得する方法を記載する。
相対パスの取得
ディレクトリの相対パスを取得するには、dirname $0
を使用する。
特殊変数$0には、現在実行しているシェルスクリプトの相対パスが格納されており、
dirname
コマンドは、引数に与えられたファイルのパスからディレクトリのパスを取得する。
逆に、basename
コマンドはファイル名を取得することができる。
以下の例では、以下のシェルスクリプトが/home/username/develop/test.shに存在する時、
このシェルスクリプトを/home/usernameディレクトリから実行すると、以下のように相対パスが出力される。
#!/bin/sh
echo $0
echo `dirname $0`
echo `basename $0`
# 出力
develop/test.sh # $0の結果
develop # dirname $0の結果
test.sh # basename $0の結果
絶対パスの取得
絶対パスを取得する手順を以下に記載する。
まず、pwd
コマンド(環境変数$PWDを使用しても同じ)でシェルスクリプトを実行したディレクトリのパスを取得する。
cd dirname $0
で絶対パスを取得する。
次に、cd
コマンドを使用してディレクトリを移動した後、pwd
コマンドで絶対パスを取得する。
$(コマンド)
または`コマンド`
のコマンド置換を忘れないこと。
また、コマンド置換はサブシェルで実行されるため、元の環境には影響を与えない。
#!/bin/sh
echo $(cd $(dirname $0) && pwd)
# 実行
sh develop/test.sh
# 出力
/home/username/develop # $(cd $(dirname $0) && pwd)の結果
※注意
cd
コマンドを使用する場合は、以下のコマンド置換に注意すること。
#!/bin/sh
echo $(cd $(dirname $0) && pwd)
# これ以降もcdされてない状態で実行される
...
cd $(dirname $0)
echo pwd
# これ以降はcdされた状態で実行される
...
また、以下のどの方法でも、カレントディレクトリの絶対パスを取得できる。
current_dir=$(pwd)
current_dir="$PWD"
current_dir=`pwd`
実行中のシェルスクリプトがあるディレクトリに移動する
シェルスクリプトの処理において、シェルスクリプトが配置されているディレクトリをカレントディレクトリとすることを前提として記述されている場合、
他のディレクトリにいる時、シェルスクリプト内のコマンドを実行することができなくなってしまう。
このような場合、シェルスクリプトの先頭で、そのシェルスクリプトがあるディレクトリに移動するように記述すると、
どのディレクトリからでも実行できるスクリプトにすることができる。
以下の例では、dirname
コマンドを利用してカレントディレクトリを移動している。
シェルスクリプトは新しく起動したシェル内で実行されるため、このスクリプトを起動したシェルのカレントディレクトリが移動することはない。
ただし、source
コマンドで起動した場合はカレントディレクトリが移動するので、注意すること。
#!/bin/sh
# シェルスクリプトのあるディレクトリへ移動
cd `dirname $0`
# あとは好きな処理を記述していく
...