Linux source コマンド
一、source コマンドとは
source は Linux/Unix システムにおけるシェルの組み込みコマンドで、現在のシェル環境で指定されたファイル内のコマンドを実行するために使用します。スクリプトを直接実行するのとは異なり、source コマンドは新しいサブシェルを作成せず、現在のシェルでファイルの内容を直接実行します。
例え話で理解する
source コマンドは「コピー&ペースト」操作のように考えることができます:
- 通常のスクリプト実行:ファイルを他の人に送って実行してもらうようなもの(新しいターミナルを開く)
- source コマンド:ファイルの内容を現在のターミナルに直接貼り付けて実行するようなもの
二、source コマンドの基本構文
実例
sourceファイル名[パラメータ]
または、同等のドット(.)記法を使用します:
実例
. ファイル名[パラメータ]
パラメータの説明
- ファイル名:実行するスクリプトファイルのパス(相対パスまたは絶対パスを指定できます)
- パラメータ:省略可能。スクリプトに渡すパラメータ
三、source コマンドとスクリプト直接実行の違い
| 比較項目 | source コマンド | スクリプトを直接実行 |
|---|---|---|
| 実行環境 | 現在のシェル環境 | 新しいサブシェル環境 |
| 変数への影響 | 現在のシェルの環境変数を変更する | 現在のシェルの環境には影響しない |
| プロセスとの関係 | 新しいプロセスを作成しない | 新しいプロセスを作成する |
| 終了への影響 | スクリプト内に exit がある場合、現在のシェルが終了する | サブシェルのみが終了する |
四、source コマンドの代表的な使用シーン
1. 環境変数設定の読み込み
最も一般的な用途は、~/.bashrc 或 /etc/profileなどの設定ファイルを読み込むことです:
実例
source ~/.bashrc
2. 仮想環境のアクティブ化
Python 開発で仮想環境をアクティブにする場合:
実例
source venv/bin/activate
3. 現在のシェル環境の更新
設定ファイルを変更したが再ログインしたくない場合:
実例
source /etc/profile
4. モジュール化されたスクリプト開発
大規模なスクリプトを複数の小さなファイルに分割し、source で読み込みます:
実例
# メインスクリプト内
source utils.sh # ユーティリティ関数を読み込む
source config.sh # 設定を読み込む
source utils.sh # ユーティリティ関数を読み込む
source config.sh # 設定を読み込む
五、実際の使用例
例1:カスタム環境変数の読み込み
テストファイルを作成myenv.sh:
実例
#!/bin/bash
export MY_VAR="Hello World"
alias ll='ls -alF'
export MY_VAR="Hello World"
alias ll='ls -alF'
source で読み込む:
実例
source myenv.sh
echo $MY_VAR # 出力: Hello World
ll # ls -alF と同等
echo $MY_VAR # 出力: Hello World
ll # ls -alF と同等
例2:スクリプトのデバッグ
スクリプトをデバッグする際、source を使用するとスクリプト内で設定された変数を保持できます:
実例
source debug_script.sh
# スクリプト内で設定された変数を現在のシェルで確認できる
# スクリプト内で設定された変数を現在のシェルで確認できる
六、注意事項とよくある問題
- セキュリティ:source は現在の環境でファイルの内容を直接実行するため、信頼できるファイルのみを source してください
- ファイルの検索:source は現在のシェルの PATH を使用してファイルを検索します。完全なパスを使用することをお勧めします
- エラー処理:source したファイルにエラーがあると、現在のシェルに影響します
- 再帰の問題:source したファイル内で自分自身を再び source しないでください。無限ループが発生します
よくあるエラー
実例
# エラー:ファイルに実行権限が必要なことを忘れている
source ./script.sh # script.sh が読み取り不可の場合
# エラー:ファイルが存在しない
source non_exist_file.sh
source ./script.sh # script.sh が読み取り不可の場合
# エラー:ファイルが存在しない
source non_exist_file.sh
七、代替方法の比較
1. source vs export
export変数の設定のみsource任意のコマンドを実行できる
2. source vs eval
evalファイルではなく文字列を実行するsourceより安全で、明確なファイルソースがある
Linux コマンド大全