シェルスクリプトの基礎 - パスの取得

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

ここでは、シェルスクリプトで相対パスと絶対パスを取得する方法を記載する。


相対パスの取得

ディレクトリの相対パスを取得するには、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`  
 
 # あとは好きな処理を記述していく
 ...