現場で使えるシェルスクリプト入門19:sourceコマンド(.)による設定ファイル・環境変数の読み込みと共通化

シェルスクリプト IT

前回の記事(入門18)では、Web APIや外部Webサーバーと通信してデータを取得・送信するための超定番ツール「curl」コマンドの基本的な使い方と、HTTPステータスコードによる安全なエラー判定方法について解説しました。

今回は、シェルスクリプトの保守性・再利用性を飛躍的に高めるための必須テクニックである「sourceコマンド(ドットコマンド .)」の使い方を解説します。

データベースの接続情報やAPIキーなどの秘匿情報を「外部の設定ファイル」に切り離して読み込んだり、共通のログ出力関数をライブラリとして使い回すことで、安全で管理しやすいシェルスクリプトを構築できるようになります!

sourceコマンド(. コマンド)とは?

source コマンド(同等の略記として . ドット1文字のコマンド)は、「指定した外部ファイルに書かれたシェルスクリプトや変数を、現在のシェルプロセス内で直接実行・読み込む」ためのコマンドです。

通常のシェルスクリプト実行と source 実行の決定的な違いは、「サブシェル(別の独立したプロセス)」で動くか、「現在のシェル」で動くかです。

  • 通常のスクリプト実行(例: ./sub_script.sh
    新しい子プロセス(サブシェル)が立ち上がって実行されます。そのため、sub_script.sh の中で定義した変数や関数は、実行が終わると親プロセス(元のシェル)には一切残りません。
  • source による読み込み(例: source ./config.env または . ./config.env
    現在のプロセス自身がファイルを一行ずつ読み込んでそのまま取り込みます。そのため、読み込んだファイル内で定義されている変数や関数が、呼び出し元のスクリプト内でもそのまま有効になります。

source はBashなどの拡張コマンドであり、POSIX規格(標準シェルの仕様)に準拠しているのは .(ドット)です。互換性を重視する場合は . を使うのが一般的です。

設定ファイルと共通ライブラリを読み込むサンプルスクリプト

ここでは、実際のバッチ処理を想定し、以下の3つのファイルに分割して構築するサンプルスクリプトを作成します。

  1. config.env(設定・環境変数ファイル)
  2. utils.sh(共通ログ出力ライブラリ)
  3. main_batch.sh(メイン処理スクリプト)

1. config.env(設定・環境変数ファイル):

# バッチ処理用 設定ファイル
DB_HOST="192.168.1.100"
DB_NAME="app_production"
API_KEY="secret_api_key_12345"

2. utils.sh(共通ライブラリ関数):

#!/bin/bash

# 日時付きログ出力関数
log_info() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] $1"
}

log_error() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR] $1" >&2
}

3. main_batch.sh(メインスクリプト):

#!/bin/bash

# スクリプトを安全に実行するための基本設定
set -euo pipefail

# 💡 スクリプトが存在するディレクトリの絶対パスを取得する(cron実行対策)
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)

# 1. 外部の設定ファイルと共通ライブラリを . コマンドで読み込む
if [ ! -f "$SCRIPT_DIR/config.env" ]; then
    echo "エラー: 設定ファイル (config.env) が見つかりません。" >&2
    exit 1
fi

if [ ! -f "$SCRIPT_DIR/utils.sh" ]; then
    echo "エラー: 共通ライブラリ (utils.sh) が見つかりません。" >&2
    exit 1
fi

# ドットコマンドでファイルをカレントプロセスに読み込む
. "$SCRIPT_DIR/config.env"
. "$SCRIPT_DIR/utils.sh"

# 2. 読み込んだ関数と変数をそのまま使用する
log_info "--- バッチ処理を開始します ---"
log_info "接続先DB: $DB_HOST ($DB_NAME)"
log_info "APIキー『$API_KEY』を使用して認証中..."

# 処理完了
log_info "--- バッチ処理が正常に完了しました ---"

スクリプトの実行手順と事前準備

以下のステップで、3つのファイルを作成して動作を確認します。

手順1. 実行権限の付与

メインスクリプトに実行権限を付与します。(※読み込まれる側の config.envutils.sh には実行権限がなくても source. で問題なく読み込めます)。

chmod +x main_batch.sh

手順2. メインスクリプトの実行

メインスクリプトを実行し、設定ファイルの変数とライブラリの関数が正常に読み込まれていることを確認します。

$ ./main_batch.sh
[2026-07-23 21:50:00] [INFO] --- バッチ処理を開始します ---
[2026-07-23 21:50:00] [INFO] 接続先DB: 192.168.1.100 (app_production)
[2026-07-23 21:50:00] [INFO] APIキー『secret_api_key_12345』を使用して認証中...
[2026-07-23 21:50:00] [INFO] --- バッチ処理が正常に完了しました ---

プログラムコードの詳細解説

上記のスクリプトで使われている主要なテクニックを解説します。

  • 絶対パスの動的取得(SCRIPT_DIR=$(cd “$(dirname “$0″)” && pwd))
    dirname "$0" は実行されたスクリプト自身の存在するディレクトリパスを取得します。cd ... && pwd を組み合わせることで、どのディレクトリから実行しても「スクリプト本体が置いてある場所の絶対パス」を正確に特定できます。後述するcron実行時のトラブルを防ぐための常套句です。
  • 事前存在チェック([ ! -f … ])
    source. で存在しないファイルを読み込もうとすると、スクリプトがエラーになったり意図しない動作を引き起こします。事前に if [ ! -f "$FILE" ]; then でファイルの存在を確認し、存在しない場合はエラーメッセージを出して終了させます。
  • ドットコマンド(. )による取り込み
    . "$SCRIPT_DIR/config.env" により、設定ファイルで定義された DB_HOSTAPI_KEY などのシェル変数がメインスクリプト内のローカル変数として即座に展開されます。

シェルスクリプト連携時の落とし穴とエラーハンドリング

source. コマンドを使って外部ファイルを読み込む際、特に気をつけるべき「2つの落とし穴」とその対策を解説します。

① 相対パス指定で予期せぬエラー

スクリプト内で . ./config.env のように相対パスで記述した場合、手動でスクリプトがあるディレクトリに移動して実行したときは正常に動作します。しかし、夜間の cron ジョブなどから実行した場合は注意が必要です。

cron では、スクリプトが保存されているディレクトリがカレントディレクトリになるとは限りません。環境によっては実行ユーザーのホームディレクトリなどがカレントディレクトリとなるため、相対パスで指定した config.env が見つからず、「No such file or directory」 エラーになることがあります。

相対パスで外部ファイルを読み込む場合は、サンプルのように SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) を使用してスクリプト自身のディレクトリを取得し、"$SCRIPT_DIR/config.env" のように指定することをおすすめします。

② 読み込まれる側ファイルによる副作用

source. は「現在のシェルプロセスの中でコードをそのまま実行する」という性質を持っています。そのため、読み込まれる側のファイル(例: utils.sh)に exit 1 や、あるいは変数の上書きなどが記述されていると、呼び出し元のシェル環境にもその影響が及びます。例えば、exit 1 が実行されるとメインスクリプトごと終了し、変数を上書きすると呼び出し元の変数も変更されてしまうため、ライブラリとして読み込むスクリプトではこれらの副作用に注意が必要です。

まとめ

今回は、外部の設定ファイルや共通関数を読み込んでスクリプトをモジュール化する「source」コマンド(. コマンド)の仕組みと使い方について解説しました。

source コマンドを活用して秘匿情報や共通処理を分離することで、コードの重複を防ぎ、セキュリティと保守性の高いシェルスクリプトを作成できるようになります。ぜひ実践に取り入れてみてください!

コメント

タイトルとURLをコピーしました