source – 現在のシェルでファイルのコマンドを実行する

環境変数

source は指定したファイル内のコマンドを「新しいシェルを起動せずに」現在のシェル環境でそのまま実行します。環境変数や関数、カレントディレクトリの変更などが呼び出し元のシェルに反映されます。
実務では、プロジェクト用の初期化スクリプトやシェル設定(例:~/.bashrc)の再読み込みに使います。

構文(Syntax)

# bash / zsh
source FILE [ARGUMENT ...]
. FILE [ARGUMENT ...]     # POSIX互換の同義コマンド(ドット)
  • FILE にスラッシュが含まれない場合、bashPATH を使って検索します。
  • 追加した ARGUMENT は読み込まれたファイル内で位置パラメータ($1, $2, …)として参照できます。

主なオプション一覧

bashsource(および .)は基本的にオプションを持ちません。必要に応じて引数を渡す形で使います。
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 風ファイルの取り込みに便利。
  • returnsource されたファイルから抜ける(スクリプトを途中で戻る)ために使用可。

備考

  • 環境依存source は Bash / Zsh など多くのシェルにありますが、POSIX標準はドット (.) です。BusyBox ashdash では source が使えず、. を使用します。
  • PATH検索:Bash ではファイル名にスラッシュが無いと PATH を検索します。意図しない別ファイルを読まないよう、相対パス(./file)や絶対パスの明示が安全です。
  • 権限source するファイルは「実行権限は不要」です(読み取り権限は必要)。シェバン(#!)は無視されます。
  • セキュリティ:任意のコマンドが現在のシェルで実行されます。内容を信頼できるファイルのみを読み込んでください。
  • sudo についてsudo source ... は意味がありません(sudo は新しいプロセスで実行し、呼び出し元のシェル環境は変わらないため)。権限が必要なら、ファイルの作成・編集時に sudo を使い、読み込み自体は通常ユーザーで行うのが一般的です。
  • 終了ステータス:戻り値は読み込んだファイル内で最後に実行されたコマンドの終了ステータスです。条件分岐での利用に便利です(例:if source ./setup.sh; then ... fi)。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント