このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:sourceコマンドとパス

sourceコマンドとパス
シェルスクリプトを作成し実行する際、source コマンドは非常に便利なツールですが、その動作とサーチパス(PATH)の関係について理解しておくことが重要です。ここでは、source コマンドとパスの関係について詳しく解説し、注意点やベストプラクティスを紹介します。

sourceコマンドとサーチパスの関係
ここでは、以下の「シェルスクリプトの自分専用の配置場所を作る」で解説した内容の捕捉をします。
sourceコマンドの基本動作
source コマンドは、指定したファイルを現在のシェル環境で読み込み、その内容を実行します。この際、ファイル名だけを指定すると、シェルはサーチパス(PATH)内のディレクトリからもファイルを探索します。
例:~/bin に配置したスクリプトの実行
「シェルスクリプトの自分専用の配置場所を作る」で作成した disksize.sh スクリプトが ~/bin に配置されており、PATH に ~/bin が含まれているとします。
ステップ1:カレントディレクトリにスクリプトが存在しないことを確認
user01@ubuntu:~$ ls disksize.sh出力結果
ls: 'disksize.sh' にアクセスできません: そのようなファイルやディレクトリはありません解説
- カレントディレクトリには
disksize.shが存在しません。
ステップ2:source コマンドでスクリプトを実行
user01@ubuntu:~$ source disksize.sh出力結果
18M /home/user01解説
sourceコマンドでファイル名だけを指定しましたが、PATHに~/binが含まれているため、シェルは~/bin/disksize.shを見つけて実行しました。
PATHにディレクトリを追加する際のパスの順序の重要性
シェルスクリプトを配置し、環境変数 PATH にディレクトリを追加する際、パスの順序が非常に重要となります。PATH に含まれるディレクトリの順序は、コマンドの検索順序を決定し、システムの動作やセキュリティに直接影響を与えます。
- シェルがコマンドを実行する際、
PATHに指定されたディレクトリを左から右の順序で検索します。 - 複数のディレクトリに同じ名前のコマンドが存在する場合、
PATHの順序によってどのコマンドが実行されるかが決まります。 - パスの順序によっては、システムのコマンドよりも先にユーザーのカスタムスクリプトが実行される可能性があります。
サーチパス探索のメリットとデメリット
メリット
- 利便性の向上
・ファイル名だけでスクリプトを実行できるため、入力が簡単になります。
デメリット
- 予期せぬファイルの読み込みリスク
・サーチパス内に同名の別のスクリプトが存在する場合、意図しないファイルを読み込んでしまう可能性があります。
・セキュリティ上のリスクや、思わぬ動作の原因となります。
現在のPTAHの確認
現在のPATH変数を確認します。
「シェルスクリプトの自分専用の配置場所を作る」で「~/bin」をPATHの最後に追加しましたが、PATHの先頭に「/home/user01/bin」が増えていることが分ります。PATHに追加した記憶のない「/home/user01/bin」が、勝手にを追加されています。
※もしも「/home/user01/bin」がPATHの先頭にない場合は、一度、ログアウトしてログインしなおします。
user01@ubuntu:~$ echo $PATH
/home/user01/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
/usr/games:/usr/local/games:/snap/bin:/snap/bin:~/binこれは、「.profile」が関係しています。
「.profile」の内容を確認します。
user01@ubuntu:~$ cat .profile
...(省略)...
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
...(省略)...「PATH="$HOME/bin:$PATH"」のところに注目します。
ホームディレクトリに「bin」というディレクトリがある場合に、自動的にホームディレクトリ配下のbinディレクトリが検索パスの先頭になるように指定されています。
これは、自作したシェルスクリプトが最優先で実行されるということを意味しています。
もしも、コマンド名と同名のシェルスクリプトが存在する場合は、既存のコマンドではなく自作したシェルスクリプトが実行されてしまうことを意味します。
ベストプラクティス:パスを明示的に指定する
相対パスや絶対パスの使用
source コマンドを使用する際には、ファイル名だけを指定せず、相対パスまたは絶対パスでファイルを指定することが無難です。
例:相対パスでの実行
user01@ubuntu:~$ source ~/bin/disksize.sh解説
~/bin/disksize.shと明示的にパスを指定することで、読み込むファイルを正確に指定できます。
理由
- 安全性の確保
・誤って別のスクリプトを読み込むリスクを低減します。
・システム全体の安定性とセキュリティを維持できます。
sourceコマンドでのサーチパス探索を無効化する
source コマンドがサーチパスからファイルを探索しないように設定することも可能です。これは、shopt コマンドを使用して sourcepath オプションを無効化することで実現できます。
設定方法
user01@ubuntu:~$ shopt -u sourcepath解説
shopt -u sourcepath:sourcepathオプションを無効化します。- これにより、
sourceコマンドはサーチパスを使用せず、カレントディレクトリからのみファイルを探索します。
動作確認
ステップ1:sourcepath を無効化
user01@ubuntu:~$ shopt -u sourcepathステップ2:ファイル名だけで source を実行
user01@ubuntu:~$ source disksize.sh出力結果
bash: disksize.sh: そのようなファイルやディレクトリはありません解説
sourcepathが無効化されているため、sourceコマンドはサーチパスを探索せず、カレントディレクトリにdisksize.shが存在しないためエラーとなります。
ステップ3:相対パスで source を実行
user01@ubuntu:~$ source ~/bin/disksize.sh出力結果
18M /home/user01解説
- パスを明示的に指定することで、
sourceコマンドが正しくスクリプトを読み込み、実行します。
sourcepath オプションの確認方法
現在の sourcepath オプションの状態を確認するには、shopt コマンドを使用します。
user01@ubuntu:~$ shopt sourcepath出力例
sourcepath off解説
sourcepathがoffになっていることが確認できます。
sourcepath を有効化するには
sourcepath を有効化したい場合には、以下のコマンドを実行します。
user01@ubuntu:~$ shopt -s sourcepath サーチパスに自分専用のディレクトリを追加する際の注意点
サーチパスに自分専用のディレクトリ(例:~/bin)を追加することは、便利な反面、注意が必要です。
諸刃の剣である理由
- メリット
・自分で作成したスクリプトを手軽に実行できます。 - デメリット
・サーチパス内に存在する同名のコマンドやスクリプトと競合する可能性があります。
・不注意により、不本意なコマンドを実行することで、他のユーザーやシステム全体に影響を及ぼすリスクがあります。
対策
- ファイル名をユニークにする
・システムコマンドと同名のスクリプトを作成しないようにします。 - サーチパスの順序を確認
・サーチパス内でのディレクトリの順序を確認し、意図しないファイルが優先されないようにします。
まとめ
sourceコマンドは、ファイル名だけを指定するとサーチパス内からファイルを探索します。
・便利な機能ですが、予期せぬファイルを読み込むリスクがあります。- 安全なスクリプト実行のために、パスを明示的に指定することが推奨されます。
・相対パスや絶対パスを使用して、読み込むファイルを正確に指定します。 shoptコマンドを使用して、sourceコマンドのサーチパス探索を無効化できます。
・shopt -u sourcepathで無効化し、セキュリティを強化します。- サーチパスに自分専用のディレクトリを追加する際は、注意が必要です。
・ファイル名の衝突やセキュリティリスクを避けるため、適切なパスの管理が重要です。
ここまで、シェルスクリプトの基本的な作成方法と実行方法について詳しく解説してきました。これらの知識を活用することで、必要に応じて自分でスクリプトを作成し、Linuxの便利な機能をさらに引き出すことができます。さまざまなシェルスクリプトを書いて、自分の環境をより使いやすくカスタマイズしていくことは、Linuxを利用する大きな魅力の一つです。
