このページで解説している内容は、以下の 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を利用する大きな魅力の一つです。