実行ファイルが置かれているディレクトリ名を取得する

シェルスクリプトの中で,そのシェルスクリプトが置かれているディレクトリ名が知りたい,と思いました(絶対パスで)。Pythonでいうところの,

import os
os.path.abspath(os.path.dirname(__file__))

です。


これをシェルでやるには,そのファイルのあるところまで移動して(cd),そのディレクトリ名を出力する(pwd),ということをします。で,それを一行で書くには,サブコマンド$()をネストさせて,次のようになります。

$(cd $(dirname $0); pwd)


$0はそのシェルスクリプトのファイル名が入るので,dirnameコマンドでそのファイルがあるディレクトリが得られます。ただしこれをechoすると,コマンドライン相対パスで入力した場合には(ほとんどの場合そうすると思いますが),その入力のまま相対パスディレクトリ名が出力されます。絶対パスで出力したい場合には,cdでそこまで移動して,pwdで出力します。


なお,ディレクトリ名ではなく実行ファイルのファイル名の絶対パスを得たい場合には,これに$(basename $0)を組み合わせます。


余談ですが,これまでサブシェルの実行結果はバッククォート(`)を使って得ていましたが,$()の方が良さそうでした。

 従来のシェル構文では,サブコマンドを$()ではなくバッククォート(`)で囲んでいた。$()構文の方がネストしやすく,間違いなく読みやすいので,``構文よりも望ましい。ただし,特に古いスクリプトやBourne/Cシェル世代では,おそらく$()よりも``のほうがよく使用されるだろう。
p. 51

http://amzn.to/Uk7tIk