source / .(ドット)
『source』(または『.』ドット)は別のシェルスクリプトを現在のシェルで読み込んで実行するコマンドです。変数や関数の定義を別ファイルに分けて再利用したり、設定ファイルを再読み込みしたりするときに使います。
構文
別スクリプトを現在のシェルで読み込みます(source コマンド)。
source ファイルパス
ドット(.)コマンドでも同じ動作です(POSIX 準拠)。
. ファイルパス
設定ファイルを再読み込みします(変更を即反映)。
source ~/.bashrc . ~/.bashrc
関数ライブラリを読み込みます。
source ./lib/functions.sh
source と bash の違い
| 実行方法 | 概要 |
|---|---|
| source ファイル | 現在のシェルで実行します。変数・関数の定義が呼び出し元に引き継がれます。 |
| . ファイル | source と同義です(POSIX 準拠の書き方)。 |
| bash ファイル | サブシェルで実行します。変数・関数は呼び出し元に引き継がれません。 |
| ./ファイル | サブシェルで実行します(bash と同様、呼び出し元に変数は残りません)。 |
サンプルコード
以下の2つのファイルを用意します。『lib/config.sh』は共通設定を定義するファイルです。
lib/config.sh
#!/usr/bin/env bash
DB_HOST="localhost"
DB_NAME="myapp"
DB_USER="dbuser"
APP_ENV="production"
log() {
echo "[$(date +%Y-%m-%d\ %H:%M:%S)] $*"
}
『source』で設定ファイルを読み込むと、定義した変数や関数が現在のシェルで使えるようになります。
main.sh
#!/usr/bin/env bash source ./lib/config.sh log "データベースに接続中: $DB_HOST/$DB_NAME" echo "環境: $APP_ENV"
bash main.sh [2026-03-06 12:00:00] データベースに接続中: localhost/myapp 環境: production
『.env』ファイルを読み込んで環境変数を一括設定するパターンです。
.env
API_KEY=secret123 DEBUG=true
load_env.sh
source .env echo "API キー: $API_KEY"
bash load_env.sh API キー: secret123
『source』と『bash』の違いを確認します。『bash』はサブシェルで実行するため変数が呼び出し元に残りません。
diff_test.sh
cat > /tmp/test.sh <<'EOF'
MY_VAR="hello from script"
EOF
# bash で実行(サブシェル: 変数は残らない)
bash /tmp/test.sh
echo "bash 後: ${MY_VAR:-未定義}"
bash diff_test.sh bash 後: 未定義
『source』で読み込むと、現在のシェルで実行されるため変数が引き継がれます。
source /tmp/test.sh echo "source 後: $MY_VAR" source 後: hello from script
概要
『$ source』の最大の特徴は現在のシェルプロセスで実行することです。『~/.bashrc』や『~/.zshrc』の変更を即反映する場合も『$ source ~/.bashrc』を使います。
共通の関数・変数を定義した「ライブラリファイル」を『$ source』で読み込むパターンは複数スクリプトの保守性を高めます。読み込むファイルが存在しない場合はエラーになるため、『[ -f ファイル ]』で存在を確認してから読み込むと安全です。
[ -f config.sh ] && source config.sh
条件式の詳細は test / [ ] / [[ ]] を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。