Bashスクリプトの実行ディレクトリ取得:コード例解説
Bashスクリプトの実行ディレクトリを取得する
Bashスクリプト内で、そのスクリプトが置かれているディレクトリを取得する方法について説明します。
方法
主に以下の方法があります。
方法1: dirname $0
を使う
$0
はスクリプト自身のパスを表します。dirname
コマンドは、ファイルパスのディレクトリ部分のみを取り出します。
#!/bin/bash
SCRIPT_DIR=$(dirname "$0")
echo "スクリプトのディレクトリ: $SCRIPT_DIR"
方法2: readlink -f $0
と dirname
を使う
readlink -f $0
はスクリプトの絶対パスを取得します。
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "スクリプトのディレクトリ: $SCRIPT_DIR"
どちらを使うべきか
一般的には、方法1の dirname $0
で十分な場合が多いです。しかし、シンボリックリンクや特殊なファイルシステム環境での動作を考慮する必要がある場合は、方法2がより信頼性が高いです。
注意事項
- スクリプトの実行時にカレントディレクトリが変更されている場合、スクリプトのディレクトリとカレントディレクトリは異なる可能性があります。
- スクリプトのパスに特殊文字が含まれる場合、適切な引用符を使用してください。
例
#!/bin/bash
# スクリプトのディレクトリを取得
SCRIPT_DIR=$(dirname "$0")
# スクリプトと同じディレクトリにあるファイルを読み込む
FILE_PATH="$SCRIPT_DIR/data.txt"
備考
pwd
コマンドはスクリプトの実行時のカレントディレクトリを取得するため、スクリプトのディレクトリを取得する目的には適していません。cd
コマンドはディレクトリを変更するものであり、スクリプトのディレクトリを取得するためのものではありません。
#!/bin/bash
SCRIPT_DIR=$(dirname "$0")
echo "スクリプトのディレクトリ: $SCRIPT_DIR"
$0
: スクリプト自身へのパスを表す変数です。dirname
: ファイルパスのディレクトリ部分のみを抽出するコマンドです。$( )
: コマンドの出力結果を別の変数に代入する際に使用します。
解説:
dirname "$0"
の部分で、スクリプト自身のパスからディレクトリ部分を抜き出し、その結果をSCRIPT_DIR
という変数に代入しています。echo
コマンドで、SCRIPT_DIR
変数の内容を出力し、スクリプトのディレクトリを表示しています。
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "スクリプトのディレクトリ: $SCRIPT_DIR"
readlink -f $0
: スクリプトへのシンボリックリンクを辿り、絶対パスを取得します。
readlink -f "$0"
の部分で、スクリプトへのシンボリックリンクが存在する場合でも、そのリンク先の絶対パスを取得します。- 取得した絶対パスに対して
dirname
コマンドを実行し、ディレクトリ部分を抜き出してSCRIPT_DIR
変数に代入します。
どちらのコードを使うべきか
dirname $0
: 一般的なケースではこちらで十分です。シンプルで分かりやすいコードです。readlink -f $0
: シンボリックリンクや複雑なファイルシステム環境下でも、より正確な結果を得たい場合に利用します。
具体的な利用例
#!/bin/bash
# スクリプトのディレクトリを取得
SCRIPT_DIR=$(dirname "$0")
# スクリプトと同じディレクトリにある設定ファイルを読み込む
CONFIG_FILE="$SCRIPT_DIR/config.json"
# 設定ファイルが存在するか確認
if [ -f "$CONFIG_FILE" ]; then
# 設定ファイルを読み込んで処理を行う
# ...
else
echo "設定ファイルが見つかりません。"
fi
上記の例では、スクリプトのディレクトリを取得し、そのディレクトリにある config.json
という設定ファイルを読み込む処理を行っています。
Bashスクリプト内で、スクリプト自身が置かれているディレクトリを取得する方法は、主に dirname $0
と readlink -f $0
を組み合わせる方法が一般的です。どちらの方法を使うかは、スクリプトの設置環境や必要な精度によって選択します。
ポイント:
readlink -f
コマンドは、シンボリックリンクを解決する際に役立ちます。
従来の方法のおさらい
これまで、Bashスクリプトの実行ディレクトリを取得する主な方法として、dirname $0
や readlink -f $0
を利用する方法をご紹介してきました。これらの方法は、多くのケースで有効ですが、より複雑な状況や特定のニーズに対応するために、他の方法も知っておくと便利です。
代替方法
pwd コマンドと cd コマンドの組み合わせ
pwd
: 現在の作業ディレクトリ(カレントディレクトリ)を表示します。cd
: ディレクトリを変更します。
#!/bin/bash
# スクリプトの実行時のカレントディレクトリを保存
ORIGINAL_DIR=$(pwd)
# スクリプトのディレクトリに移動
cd "$(dirname "$0")"
# スクリプトのディレクトリを出力
SCRIPT_DIR=$(pwd)
echo "スクリプトのディレクトリ: $SCRIPT_DIR"
# 元のカレントディレクトリに戻す
cd "$ORIGINAL_DIR"
- スクリプトの実行時のカレントディレクトリを
ORIGINAL_DIR
変数に保存します。 cd
コマンドで、スクリプトのディレクトリに移動します。pwd
コマンドで、現在の作業ディレクトリ(つまり、スクリプトのディレクトリ)を取得し、SCRIPT_DIR
変数に代入します。cd
コマンドで、元のカレントディレクトリに戻ります。
注意: この方法は、スクリプトの実行後にカレントディレクトリを変更したくない場合に有効ですが、cd
コマンドによるディレクトリの変更は、スクリプトの他の部分に影響を与える可能性があるため、注意が必要です。
realpath コマンド
realpath
コマンドは、シンボリックリンクを解決し、絶対パスを取得します。
#!/bin/bash
SCRIPT_DIR=$(dirname "$(realpath "$0")")
echo "スクリプトのディレクトリ: $SCRIPT_DIR"
readlink -f
と同様、シンボリックリンクを解決しますが、realpath
はより多くのファイルシステムの種類に対応している場合があります。
どの方法を選ぶべきか
- シンプルで一般的なケース:
dirname $0
- シンボリックリンクや複雑なファイルシステム:
readlink -f $0
またはrealpath
- カレントディレクトリを固定したい:
pwd
とcd
の組み合わせ - 特定のファイルシステムの挙動: 各コマンドのマニュアルページを参照
Bashスクリプトの実行ディレクトリを取得する方法は、様々な状況に合わせて複数の選択肢があります。どの方法を選ぶかは、スクリプトの目的や実行環境によって異なります。
readlink -f
やrealpath
は、シンボリックリンクを解決するために使用します。pwd
とcd
は、カレントディレクトリを操作するために使用します。
これらの知識を組み合わせることで、より複雑なスクリプトを作成することができます。
- シェルの種類: Bash以外にも、Zshやkshなど、様々なシェルが存在します。各シェルのコマンドや変数の扱いは、わずかに異なる場合があります。
- スクリプトの配置場所: スクリプトをどこに配置するかによっても、実行ディレクトリの取得方法が変わる場合があります。
bash directory