「ログアウトしてログインし直さないと、変更したPATHが有効にならない」
Linuxの設定ファイルを編集した後、変更を即座に反映させるのが
source コマンドです。いちいちログインし直す必要がなくなるため、サーバー運用では日常的に使います。この記事では、
sourceコマンド(ドットコマンド)の使い方から、.bashrc と .bash_profile の違い、シェルスクリプトでの設定外部化パターンまで実践的に解説します。この記事のポイント
・sourceコマンドで設定ファイルをログアウトなしで即時反映できる
・ドットコマンド(.)はsourceと同じ動作で、sh環境でも使える
・source実行と./実行の違いを理解しないと環境変数の設定ミスにハマる
・.confファイルをsourceで読み込み、環境ごとの設定を切り替えられる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
sourceコマンドとは?~設定変更を即座に反映する
source コマンドは、指定したファイルを現在のシェル環境で読み込んで実行するコマンドです。通常、
.bashrc などの設定ファイルはログイン時に自動で読み込まれます。しかし、設定を変更した場合、そのままでは変更が反映されません。source を使えば、ログアウトせずに変更を即座に反映できます。# 基本書式 # source ファイル名 # .bashrc の変更を即座に反映する $ source ~/.bashrc
ドットコマンド(.)でも同じことができる
source コマンドは、ドット(.)で代用できます。動作は完全に同じです。# source コマンドで読み込む $ source ~/.bashrc # ドットコマンドで読み込む(同じ動作) $ . ~/.bashrc
.(ドット)は POSIX 標準で定義されている書き方で、sh(Bourneシェル)でも使えます。一方、source は bash の拡張コマンドのため、sh では使えない場合があります。迷ったら
source を使えば問題ありませんが、シェルスクリプトの先頭が #!/bin/sh の場合はドットコマンドを使ってください。主な設定ファイルと読み込みタイミング
source で読み込む代表的な設定ファイルと、それぞれの自動読み込みタイミングは以下の通りです。・.bash_profile:ログイン時に1回だけ読み込まれる。環境変数(PATH等)の設定に使う
・.bashrc:bash起動のたびに読み込まれる。エイリアスやプロンプト設定に使う
・.bash_logout:ログアウト時に読み込まれる。一時ファイルの削除などに使う
・/etc/profile:全ユーザー共通の設定。ログイン時に読み込まれる
・/etc/bashrc:全ユーザー共通のbash設定。bash起動時に読み込まれる
.bashrcを編集してsourceで反映する手順
実際の作業例として、aliasを追加する手順を見てみましょう。1. .bashrcを編集する
# .bashrc をviで開く $ vi ~/.bashrc # 以下の行を追記して保存する alias ll='ls -la'
2. sourceコマンドで反映する
$ source ~/.bashrc
3. 設定が反映されたか確認する
# alias が有効になっているか確認 $ alias ll alias ll='ls -la' # 実行してみる $ ll
環境変数PATHを追加してsourceで反映する
.bash_profile にPATHを追加した場合も、source で即座に反映できます。# .bash_profile に PATH を追記 $ echo 'export PATH=$PATH:/opt/myapp/bin' >> ~/.bash_profile # source で反映 $ source ~/.bash_profile # 反映されたか確認 $ echo $PATH /usr/local/bin:/usr/bin:/bin:/opt/myapp/bin
sourceとスクリプト実行(./)の違い
これは非常に重要なポイントです。source と ./script.sh はまったく異なる動作をします。・
source script.sh:現在のシェルでスクリプトを実行する。スクリプト内で設定した変数や環境変数が、現在のシェルに残る・
./script.sh:サブシェル(子プロセス)で実行する。スクリプト内の変数は、実行後に消える実際に確認してみましょう。
# テスト用スクリプトを作成 $ echo 'export MY_VAR="hello"' > /tmp/test_env.sh # ./で実行した場合(サブシェル) $ bash /tmp/test_env.sh $ echo $MY_VAR # 何も表示されない(変数はサブシェルで消えた) # source で実行した場合(現在のシェル) $ source /tmp/test_env.sh $ echo $MY_VAR hello # 変数が現在のシェルに反映されている
source で実行してください。シェルスクリプトで.confファイルを読み込む設計パターン
設定値をスクリプト本体にハードコードすると、本番と検証で別スクリプトを管理することになり、書き換え漏れが起きます。source を使って設定を外部の .conf ファイルに分離することで、スクリプト本体を変えずに環境ごとの設定を切り替えられるようになります。1. 設定を.confファイルに書き出す
.conf ファイルは、シェバング行(#!/bin/bash)なしの変数代入文の集まりです。# /etc/myapp/backup.conf BACKUP_SRC="/var/www/html" BACKUP_DST="/mnt/backup/html" BACKUP_RETENTION=7 NOTIFY_MAIL="admin@example.com" LOG_FILE="/var/log/backup.log"
# で始め、値にスペースが含まれる場合はダブルクォートで囲みます。変数代入に = の前後スペースを入れるとbashがコマンドとして解釈してエラーになるため、スペースなしで書いてください(BACKUP_SRC=/var/www/html)。2. sourceで読み込む(ファイル存在チェックを先に)
source に存在しないファイルを渡すとエラーが分かりにくくなります。-f チェックを先に入れて、意味のあるエラーメッセージを出すのが鉄則です。#!/bin/bash set -eu CONFIG_FILE="${CONFIG_FILE:-/etc/myapp/backup.conf}" if [[ ! -f "$CONFIG_FILE" ]]; then echo "ERROR: 設定ファイルが見つかりません: $CONFIG_FILE" >&2 exit 1 fi source "$CONFIG_FILE" echo "バックアップ元: $BACKUP_SRC" echo "バックアップ先: $BACKUP_DST"
source は現在のシェルの変数空間で実行されるため、.conf で定義した変数はそのままスクリプト本体から参照できます。サブシェルを起動しないので、変数が見えなくなるトラブルが起きません。3. 環境変数でオーバーライドする3層設計
${VAR:-デフォルト値} 構文を使って「デフォルト値 < .conf < 環境変数」の3層優先度を作ります。デフォルト値の代入は必ず source より前に行ってください。後に書くと .conf の設定が消えます。# デフォルト値を先に定義してからsourceで上書きする(順序が重要) BACKUP_SRC="${BACKUP_SRC:-/var/www/html}" BACKUP_DST="${BACKUP_DST:-/mnt/backup}" BACKUP_RETENTION="${BACKUP_RETENTION:-7}" source "$CONFIG_FILE" # .confの値がデフォルト値を上書きする # 検証設定に切り替えたい場合はCONFIG_FILEを環境変数で渡す # CONFIG_FILE=/etc/myapp/backup-staging.conf ./backup.sh # 通知先だけ一時的に変えてテストする場合 # NOTIFY_MAIL=test@example.com ./backup.sh
4. validate_config関数で必須変数を一括チェック
source 直後に必須変数をまとめて検証する関数を呼ぶことで、処理の途中で「変数未設定」エラーが出るのを防げます。validate_config() { local required_vars=("BACKUP_SRC" "BACKUP_DST" "LOG_FILE") local error=0 for var in "${required_vars[@]}"; do if [[ -z "${!var:-}" ]]; then echo "ERROR: 必須変数 $var が設定されていません" >&2 error=1 fi done [[ $error -eq 0 ]] || exit 1 } # .confを読み込んだ直後に呼ぶ source "$CONFIG_FILE" validate_config # 実行時の出力例(BACKUP_DSTとLOG_FILEが未設定の場合) # ERROR: 必須変数 BACKUP_DST が設定されていません # ERROR: 必須変数 LOG_FILE が設定されていません
${!var} は変数名を文字列として受け取りその値を返す「間接参照」です。未設定の変数を全件まとめて報告してから終了するため、「エラーを直したらまた別のエラー」という往復がなくなります。Python仮想環境のactivateもsource
Pythonの仮想環境(venv)を有効にするactivate コマンドも、実は source で読み込んでいます。# Python仮想環境を作成 $ python3 -m venv myenv # 仮想環境を有効にする(source で読み込む) $ source myenv/bin/activate # プロンプトが変わり、仮想環境が有効になる (myenv) $
source で現在のシェルに環境変数を読み込むからこそ、仮想環境内のPythonやpipが優先的に使われるようになります。「source: command not found」の対処法
source は bash の組み込みコマンドです。sh や dash で実行するとエラーになります。# sh で source を使おうとするとエラーになる場合がある $ sh -c 'source ~/.bashrc' sh: source: not found # sh ではドットコマンドを使う $ sh -c '. ~/.bashrc'
echo $SHELL で確認できます。sourceでエラーが出る場合の対処法
source で設定ファイルを読み込んだときにエラーが出る場合、そのファイルに構文エラーがある可能性が高いです。$ source ~/.bashrc -bash: /home/user/.bashrc: line 15: syntax error near unexpected token # 該当行を確認して修正する $ vi ~/.bashrc
# 編集前にバックアップ $ cp ~/.bashrc ~/.bashrc.bak # 編集後に問題があれば復元 $ cp ~/.bashrc.bak ~/.bashrc $ source ~/.bashrc
本記事のまとめ(sourceコマンド早見表)
| やりたいこと | コマンド |
|---|---|
| .bashrcの変更を即座に反映する | source ~/.bashrc |
| .bash_profileの変更を反映する | source ~/.bash_profile |
| ドットコマンドで読み込む(sh互換) | . ~/.bashrc |
| 全ユーザー共通設定を反映する | source /etc/profile |
| 環境変数設定スクリプトを反映する | source スクリプトファイル名 |
| スクリプトで.confファイルを読み込む | source /etc/myapp/backup.conf |
| 実行時に設定ファイルを切り替える | CONFIG_FILE=/other.conf ./script.sh |
| Python仮想環境を有効にする | source venv/bin/activate |
| 現在のシェルを確認する | echo $SHELL |
sourceコマンドを使いこなして、設定変更を即座に反映させたいですか?
シェルの設定ファイルを安全に管理し、サーバー運用の現場で困らないスキルを体系的に学びましょう。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
<PR>手元に置いて学びを深める1冊
マスタリングLinuxシェルスクリプト 第2版 -Linuxコマンド、bashスクリプト、シェルプログラミング実践入門
bashの仕組みを体系的に学べる実務直結の一冊。まず無料メルマガで基礎を固め、手元に置いて深く学ぶのが王道です。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 次のページへ:teeコマンドの使い方|画面表示とファイル保存を同時に行う方法
- 前のページへ:envコマンドで環境変数を確認・設定する方法|export・printenvとの違いも
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドP-T・システム管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます