このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

新Linuxコマンド演習35

新Linuxコマンド演習35 概要

 「新Linuxコマンド演習35」では、bashコマンドでの実行とsourceコマンドでの実行の違いを学びます。
 同じシェルスクリプトでも、bashで実行する場合sourceで実行する場合では、変数のスコープ(有効範囲)やシェル環境への影響が異なります。

 この演習では、実際にシェルスクリプトを作成・実行しながら、サブシェル(子シェル)と現在のシェル(親シェル)の動作の違いを確認します。
これにより、シェル変数がどの範囲で有効なのかを理解できるようになります。

ここで学ぶ主なコマンドと概念

コマンド / 概念内容
bash新しいサブシェルを生成してスクリプトを実行する。親シェルの環境は変更されない。
source現在のシェル内でスクリプトを実行する。変数の変更が呼び出し元に反映される。
シェル変数シェル内で定義される変数で、exportしていない限り他のシェルからは参照できない。
サブシェル親シェルから派生して作られる新しいシェル。親シェルの変数は継承されない。

表の説明
 bashコマンドでスクリプトを実行すると新しい「サブシェル」が作成され、その中で処理が行われます。
 一方、sourceコマンドでは「現在のシェル」でスクリプトを実行するため、変数の変更が呼び出し元にも反映されます。
これが両者の最も大きな違いです。

演習問題+模範解答例

演習01:シェル変数を設定する

問題
シェル変数 name1 と name2 を設定してください。

模範解答例

[suzuki@AlmaLinux ~]$ name1="tanaka"
[suzuki@AlmaLinux ~]$ name2="yamamoto"
[suzuki@AlmaLinux ~]$ echo $name1
tanaka
[suzuki@AlmaLinux ~]$ echo $name2
yamamoto

解説

  • 変数の代入は = の前後にスペースを入れないようにします。
  • $変数名 の形で値を参照できます。
  • この段階では変数は「現在のシェル」にのみ有効です。

演習02:シェルスクリプトを作成する

問題
以下の内容のシェルスクリプト shellscript.sh を作成してください。

模範解答例

[suzuki@AlmaLinux ~]$ nano shellscript.sh

スクリプトの内容

#!/bin/bash
echo $name1
name2="watanabe"

解説

  • #!/bin/bash は「このスクリプトはbashで実行する」ことを指定します。
  • $name1 はシェル変数の値を出力します。
  • name2 の値をスクリプト内で変更し、その結果が呼び出し元に反映されるかを後で確認します。

演習03:bashコマンドで実行する

問題
bashコマンドを使って shellscript.sh を実行してください。
その後、name2 の値を確認してください。

模範解答例

[suzuki@AlmaLinux ~]$ bash shellscript.sh

[suzuki@AlmaLinux ~]$ echo $name2
yamamoto

解説

  • bashで実行すると、新しいサブシェルが作成されます。
  • そのため、スクリプト内での変更は親シェル(実行元)に影響を与えません。
  • $name1 が表示されなかったのは、スクリプト内から現在のシェルの変数が参照できないためです。

演習04:sourceコマンドで実行する

問題
同じスクリプトを source コマンドで実行し、name2 の値がどう変化するか確認してください。

模範解答例

[suzuki@AlmaLinux ~]$ source shellscript.sh
tanaka
[suzuki@AlmaLinux ~]$ echo $name2
watanabe

解説

  • source コマンドでは新しいシェルを起動せず、現在のシェル環境でスクリプトを実行します。
  • そのため、スクリプト内で設定した変数の変更は呼び出し元にも反映されます。
  • $name1 も現在のシェルで有効な変数なので、スクリプト内で正常に参照されます。

演習終了時の作業:ファイルの削除

問題
演習で作成したファイルを削除してください。

模範解答例

[suzuki@AlmaLinux ~]$ rm shellscript.sh
[suzuki@AlmaLinux ~]$ ls
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos

まとめ

新Linuxコマンド演習35」では、

  • bash実行はサブシェル内でスクリプトを実行するため、変数の変更が親シェルに影響しない。
  • source実行は現在のシェル内でスクリプトを実行するため、変数が呼び出し元にも反映される。

という重要な違いを確認しました。

 この知識は、環境設定ファイル(例:.bashrc, .profile)の読み込みや、スクリプト内で変数を共有する際に不可欠です。