source は指定したファイル内のコマンドを「新しいシェルを起動せずに」現在のシェル環境でそのまま実行します。環境変数や関数、カレントディレクトリの変更などが呼び出し元のシェルに反映されます。
実務では、プロジェクト用の初期化スクリプトやシェル設定(例:~/.bashrc)の再読み込みに使います。
構文(Syntax)
# bash / zsh
source FILE [ARGUMENT ...]
. FILE [ARGUMENT ...] # POSIX互換の同義コマンド(ドット)
FILEにスラッシュが含まれない場合、bashはPATHを使って検索します。- 追加した
ARGUMENTは読み込まれたファイル内で位置パラメータ($1,$2, …)として参照できます。
主なオプション一覧
bashのsource(および.)は基本的にオプションを持ちません。必要に応じて引数を渡す形で使います。
(zshではトレース表示などの独自オプションがありますが、ポータブルスクリプトでは避けるのが無難です。)
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | ファイルを現在のシェルで実行 | source ./init.sh |
.(同義) | POSIX準拠の同義コマンド | . ./init.sh |
| 引数(位置パラメータ化) | 実行中のみ $1,$2,... として参照可能 | source ./greet.sh Alice |
実行例
例1: 設定ファイルを再読み込み(~/.bashrc)
説明:シェルを再起動せずに設定の変更を反映します。
コマンド
source ~/.bashrc
出力例:通常は表示なし(エイリアスや関数・PS1などが更新されます)。
例2: プロジェクト初期化スクリプトを読み込む
説明:env/project.env.sh に書かれた export を現在のシェルに反映します(ファイル自体は実行権不要)。
コマンド
source env/project.env.sh
出力例:なし(echo "$PROJECT_NAME" などが使えるようになります)。
例3: 読み込むファイルへ引数を渡す
説明:読み込まれた側で $1 を使って動作を切り替えます。
準備(例):greet.sh の中身
# greet.sh
echo "Hello, ${1:-world}!"
コマンド
source ./greet.sh Alice
出力例
Hello, Alice!
例4: source と通常実行(サブシェル)の違い
説明:source はカレントディレクトリ変更が呼び出し元に残りますが、bash script.sh は呼び出し元に影響しません。
準備(例):cdtmp.sh の中身
# cdtmp.sh
cd /tmp
コマンド
pwd # 例: /home/user
source ./cdtmp.sh
pwd # /tmp に変化
bash ./cdtmp.sh
pwd # /tmp のまま(サブシェルだったため呼び出し元は不変)
例5(エラー例): 存在しないファイルを読み込む
説明:ファイルがない/読めないと非ゼロ終了ステータスになります。
コマンド
source ./notfound.sh
echo $? # 直前の終了コードを確認
出力例
bash: ./notfound.sh: No such file or directory
1
関連コマンド
.:sourceと同義の POSIX 準拠の組み込み。移植性を重視するスクリプトで推奨。bash SCRIPT.sh/sh SCRIPT.sh:新しいシェル(サブシェル)で実行。呼び出し元の環境は変化しない。export:環境変数を子プロセスに引き継ぐためのマーク。sourceで読み込むファイル内で変数をexportすると確実。set -a/set +a:一時的に「以降に定義する全変数を自動でexport」するモードに。.env風ファイルの取り込みに便利。return:sourceされたファイルから抜ける(スクリプトを途中で戻る)ために使用可。
備考
- 環境依存:
sourceは Bash / Zsh など多くのシェルにありますが、POSIX標準はドット (.) です。BusyBoxashやdashではsourceが使えず、.を使用します。 - PATH検索:Bash ではファイル名にスラッシュが無いと
PATHを検索します。意図しない別ファイルを読まないよう、相対パス(./file)や絶対パスの明示が安全です。 - 権限:
sourceするファイルは「実行権限は不要」です(読み取り権限は必要)。シェバン(#!)は無視されます。 - セキュリティ:任意のコマンドが現在のシェルで実行されます。内容を信頼できるファイルのみを読み込んでください。
- sudo について:
sudo source ...は意味がありません(sudoは新しいプロセスで実行し、呼び出し元のシェル環境は変わらないため)。権限が必要なら、ファイルの作成・編集時にsudoを使い、読み込み自体は通常ユーザーで行うのが一般的です。 - 終了ステータス:戻り値は読み込んだファイル内で最後に実行されたコマンドの終了ステータスです。条件分岐での利用に便利です(例:
if source ./setup.sh; then ... fi)。
参考
- Bash Reference Manual(Bourne Shell Builtins /
source)
https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-source - Bash manページ(
bash(1))
https://man7.org/linux/man-pages/man1/bash.1.html - POSIX
.(dot)仕様
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/dot.html

コメント