source、bash、shはすべてシェルスクリプトを実行するためのコマンドですが、それぞれ異なる特性と用途があります。以下にそれぞれの違いを詳しく説明します。
source コマンド
- シェルの組み込みコマンド: sourceはシェルの組み込みコマンドであり、外部プログラムではありません
- 現在のシェルで実行: sourceコマンドを使ってスクリプトを実行すると、そのスクリプトは現在のシェルプロセス内で実行されます。これにより、スクリプト内で設定された環境変数やシェルオプションが現在のシェルに影響を与えます
- シンタックス: source scriptname または . scriptname(ドットコマンドとしても知られています)
bash コマンド
- 外部プログラム: bashはBashシェル(Bourne Again Shell)を起動する外部プログラムです
- 新しいシェルプロセスで実行: bashコマンドを使ってスクリプトを実行すると、新しいBashシェルプロセスが作成され、その中でスクリプトが実行されます。スクリプト内で設定された環境変数やシェルオプションは、元のシェルには影響を与えません
- Bash特有の機能: bashはBashシェルの全機能をサポートしており、例えば配列、連想配列、拡張グロブ、プロセス置換などのBash特有の機能を利用できます
- シンタックス: bash scriptname
sh コマンド
- 外部プログラム: shはシェル(通常はBourne Shellまたはその互換シェル)を起動する外部プログラムです
- 新しいシェルプロセスで実行: shコマンドを使ってスクリプトを実行すると、新しいシェルプロセスが作成され、その中でスクリプトが実行されます。スクリプト内で設定された環境変数やシェルオプションは、元のシェルには影響を与えません
- 互換性: shはPOSIX標準に準拠しており、Bourne Shellスクリプトの互換性を重視します。Bash特有の機能はサポートされないことが多いです
- シンタックス: sh scriptname
具体的な違いの例
例えば、以下のようなスクリプト example.sh があるとします。
#!/bin/bash
export MYVAR="Hello, World!"
echo "Bash version: $BASH_VERSION"
sourceを使った場合
$ source example.sh
Bash version: 5.0.17(1)-release
$ echo $MYVAR
Hello, World!
sourceを使うと、example.sh内で設定された環境変数MYVARが現在のシェルに影響を与えます。また、スクリプト内のBash特有の機能も利用できます。
bashを使った場合
$ bash example.sh
Bash version: 5.0.17(1)-release
$ echo $MYVAR
bashを使うと、新しいBashシェルプロセス内でスクリプトが実行されるため、example.sh内で設定された環境変数MYVARは元のシェルには影響を与えません。
shを使った場合
$ sh example.sh
Bash version:
$ echo $MYVAR
shを使うと、新しいシェルプロセス内でスクリプトが実行されますが、Bash特有の機能(例えば$BASH_VERSION)はサポートされないため、空の出力になります。
まとめ
- source: 現在のシェルプロセス内でスクリプトを実行し、環境変数やシェルオプションに影響を与える
- bash: 新しいBashシェルプロセスを作成してスクリプトを実行し、Bash特有の機能をサポートする。元のシェルには影響を与えない
- sh: 新しいシェルプロセスを作成してスクリプトを実行し、POSIX標準に準拠する。Bash特有の機能はサポートされないことが多い。元のシェルには影響を与えない
この違いを理解することで、適切なシチュエーションで適切なコマンドを選択することができます。