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

Linuxコマンドの基本:sourceコマンドとパス

sourceコマンドとパス

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

sourceコマンドとサーチパスの関係

ここでは、以下の「シェルスクリプトの自分専用の配置場所を作る」で解説した内容の捕捉をします。

Linuxコマンドの基本:シェルスクリプトの自分専用の配置場所を作る

このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。 Linuxコマンドの基本:シェルスクリプトの自分専用の配置場所を作る シェルスクリプ…

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 sourcepathsourcepath オプションを無効化します。
  • これにより、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

解説

  • sourcepathoff になっていることが確認できます。

sourcepath を有効化するには

sourcepath を有効化したい場合には、以下のコマンドを実行します。

user01@ubuntu:~$ shopt -s sourcepath 

サーチパスに自分専用のディレクトリを追加する際の注意点

 サーチパスに自分専用のディレクトリ(例:~/bin)を追加することは、便利な反面、注意が必要です。

諸刃の剣である理由

  • メリット
    ・自分で作成したスクリプトを手軽に実行できます。
  • デメリット
    ・サーチパス内に存在する同名のコマンドやスクリプトと競合する可能性があります。
    ・不注意により、不本意なコマンドを実行することで、他のユーザーやシステム全体に影響を及ぼすリスクがあります。

対策

  • ファイル名をユニークにする
    ・システムコマンドと同名のスクリプトを作成しないようにします。
  • サーチパスの順序を確認
    サーチパス内でのディレクトリの順序を確認し、意図しないファイルが優先されないようにします。

まとめ

  • source コマンドは、ファイル名だけを指定するとサーチパス内からファイルを探索します。
    ・便利な機能ですが、予期せぬファイルを読み込むリスクがあります。
  • 安全なスクリプト実行のために、パスを明示的に指定することが推奨されます。
    ・相対パスや絶対パスを使用して、読み込むファイルを正確に指定します。
  • shopt コマンドを使用して、source コマンドのサーチパス探索を無効化できます。
    shopt -u sourcepath で無効化し、セキュリティを強化します。
  • サーチパスに自分専用のディレクトリを追加する際は、注意が必要です。
    ・ファイル名の衝突やセキュリティリスクを避けるため、適切なパスの管理が重要です。

 ここまで、シェルスクリプトの基本的な作成方法と実行方法について詳しく解説してきました。これらの知識を活用することで、必要に応じて自分でスクリプトを作成し、Linuxの便利な機能をさらに引き出すことができます。さまざまなシェルスクリプトを書いて、自分の環境をより使いやすくカスタマイズしていくことは、Linuxを利用する大きな魅力の一つです。