Linuxの$PATHにディレクトリを追加する方法

  • PATHは、コマンドを実行するときにオペレーティングシステムがチェックする場所のリストであり、実行可能ファイルを正確な場所を指定せずに実行できます。
  • シェルは、シェル組み込みから開始して、リストされたディレクトリを左から右に検索することで、PATH内の実行可能ファイルを特定の順序で検索します。
  • exportコマンドを使用して、一時的にまたは.bashrcまたは.profileファイルを編集することで永続的に、PATHにディレクトリを追加できます。セキュリティリスクを回避するために、先頭にコロンを追加しないように注意してください。

PATHは、Linuxコンピューターのバックグラウンドで動作する、目立たない操作の1つです。これはユーザーエクスペリエンスに静かに影響を及ぼしますが、怪しいものではありません。その機能と調整方法について説明します。

LinuxのPATHとは何ですか?どのように機能しますか?

PATHは、コマンドの実行を試行するたびにオペレーティングシステムがチェックする場所のリストです。実行しようとする実行可能ファイルがPATHに含まれるフォルダーに含まれている場合、オペレーティングシステムは既にその場所を知っているので、正確な場所を明示的に指定せずに実行可能ファイルを実行できます。

では、実際にはどのように機能するのでしょうか?

ターミナルウィンドウでコマンドを入力してEnterキーを押すと、コマンドが実行される前に多くのアクティビティが開始されます。

Bashは、ほとんどのLinuxディストリビューションのデフォルトシェルです。入力したテキスト行を解釈し、パラメーター、パイプ、リダイレクト、その他が存在する場合は、コマンド名と区別します。次に、それらのコマンドの実行可能バイナリを特定し、指定したパラメーターで起動します。

シェルが実行可能ファイルを特定するために最初に行う手順は、バイナリが関与しているかどうかを特定することです。使用するコマンドがシェル自体(「シェル組み込み」)内にある場合、それ以上の検索は必要ありません。

シェル組み込みは、シェルに不可欠であるため、最も簡単に見つけることができます。ツールベルトにそれらを持っているようなものです。常にあなたと一緒にいます。

ただし、他のツールの1つが必要な場合は、ワークショップに行って見つける必要があります。それはあなたの作業台にありますか、それとも壁掛けですか?それがPATH環境変数の役割です。シェルが検索する場所のリストと、検索される順序を保持します。

コマンドがシェル組み込み、エイリアス、関数、またはスタンドアロンバイナリmv /work/unfileであるかどうかを確認したい場合は、次のようにtypeコマンドを使用できます。

type clear

type cd

これは、clearがバイナリファイルであり、パスで見つかった最初のバイナリが/usr/binにあることを示しています。コンピューターにclearの複数のバージョンがインストールされている可能性がありますが、これはシェルが使用しようとするバージョンです。

当然のことながら、cdはシェル組み込みです。

PATHをリストする方法

パスに何が含まれているかを確認するのは簡単です。次のechoコマンドを入力して、$PATH変数に保持されている値を出力するだけです。

echo $PATH

出力は、コロン(:)で区切られたファイルシステムの場所のリストです。シェルはパスを左から右に検索し、各ファイルシステムの場所でコマンドを実行するための一致する実行可能ファイルをチェックします。

リストを調べて、検索されるファイルシステムの場所と検索される順序を確認できます。

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /usr/games
  • /usr/local/games
  • /snap/bin

すぐに明らかにならないかもしれないことは、検索は現在の作業ディレクトリから開始されないということです。むしろ、それはリストされたディレクトリを順にたどり、リストされたディレクトリのみをたどります。

現在の作業ディレクトリがパスにない場合、検索されません。また、パスにないディレクトリにコマンドが格納されている場合、シェルはそれらを見つけることができません。

これを示すために、rfという小さなプログラムを作成しました。実行されると、rfはターミナルウィンドウで起動されたディレクトリの名前を出力します。/usr/local/binにあります。/dave/workディレクトリにも新しいバージョンがあります。

次のwhichコマンドを入力して、シェルが見つけて使用するプログラムのバージョンを表示します。

which rf

シェルは、パスにあるディレクトリにあるバージョンが見つかったと報告します。

起動するには、次のように入力します。

rf

rfのバージョン1.0を実行すると、予想どおりになります。見つかって実行されたバージョンは/usr/local/binにあります。

このコンピューターでrfの他のバージョンを実行するには、次のようにコマンドラインで実行可能ファイルへのパスを使用する必要があります。

./work/rf

実行するrfのバージョンをシェルに指示したので、バージョン1.1を使用します。このバージョンを優先する場合は、/usr/local/binディレクトリにコピーして古いバージョンを上書きできます。

rfの新しいバージョンを開発しているとします。開発とテストの間は頻繁に実行する必要がありますが、リリースされていない開発ビルドをライブ環境にコピーしたくありません。

または、rfの新しいバージョンをダウンロードして、一般に公開する前に検証テストを実施したい場合があります。

作業ディレクトリをパスに追加すると、シェルが私たちのバージョンを見つけることができます。そして、この変更は私たちにのみ影響します。他の人は引き続き/usr/local/binにあるrfのバージョンを使用します。

PATHにディレクトリを追加する

exportコマンドを使用して、ディレクトリをPATHに追加できます。ディレクトリは、シェルが検索するファイルシステムの場所のリストに追加されます。シェルが一致する実行可能ファイルを見つけると検索を停止するため、/usr/local/binの前にディレクトリを最初に検索するようにする必要があります。

これは簡単です。この例では、次のコマンドを入力してディレクトリをパスの先頭に追加し、最初に検索される場所にします。

export PATH=/home/dave/work:$PATH

このコマンドは、追加するディレクトリ/home/dave/workと現在のパス全体を$PATHに等しく設定します。

最初のPATHにはドル記号($)がありません。PATHの値を設定します。最後の$PATHにはドル記号があり、PATH変数に格納されているコンテンツを参照しています。また、新しいディレクトリと$PATH変数名の間にコロン(:)があることに注意してください。

現在のパスがどのようになっているか見てみましょう。

echo $PATH

/home/dave/workディレクトリがパスの先頭に追加されます。指定したコロンは、パスの残りの部分と区切ります。

次のコマンドを入力して、rfのバージョンが最初に検出されることを確認します。

which rf

プリンに証明があるように、以下に示すようにrfを実行します。

rf

シェルはバージョン1.1を見つけて、/home/dave/workから実行します。

ディレクトリをパスの末尾に追加するには、コマンドの末尾に移動するだけです。

export PATH=$PATH:/home/dave/work

PATHに永続的に追加する方法

ベス・ブルック・マルシニアクが言ったように、「成功は素晴らしいですが、成功はつかの間です。」ターミナルウィンドウを閉じると、$PATHに加えた変更がすべて消えます。永続的にするには、exportコマンドを構成ファイルに配置する必要があります。

exportコマンドを.bashrcファイルに配置すると、ターミナルウィンドウを開くたびにパスが設定されます。ログインする必要があるSSHセッションとは異なり、これらは「対話型」セッションと呼ばれます。

以前は、exportコマンドを.profileファイルに配置して、ターミナルセッションにログインするためのパスを設定していました。

ただし、exportコマンドを.bashrcファイルまたは.profileファイルのいずれかに配置すると、対話型ターミナルセッションとログインターミナルセッションの両方のパスが正しく設定されることがわかりました。あなたの経験は異なるかもしれません。あらゆる事態に対処するために、両方のファイルでそれを行う方法を示します。

/homeディレクトリで次のコマンドを使用して、.bashrcファイルを編集します。

gedit .bashrc

.bashrcファイルが読み込まれた状態でgeditエディターが開きます。

ファイルの一番下までスクロールし、先ほど使用した次のエクスポートコマンドを追加します。

export PATH=/home/dave/work:$PATH

ファイルを保存します。次に、ターミナルウィンドウを閉じてから再度開くか、次のコマンドを使用して.bashrcファイルを読み取ります。

. .bashrc次に、次のechoコマンドを入力してパスを確認します。

echo $PATH

これにより、/home/dave/workディレクトリがパスの先頭に追加されます。

コマンドを.profileファイルに追加するプロセスは同じです。次のコマンドを入力します。

gedit .profile

geditエディターが.profileファイルが読み込まれた状態で起動します。

exportコマンドをファイルの一番下に追加して保存します。新しいターミナルウィンドウを閉じて開くだけでは、.profileファイルを再読み取りすることはできません。新しい設定を有効にするには、ログアウトして再度ログインするか、以下のようにdotコマンドを使用する必要があります。

. .profile

すべてのユーザーのパスを設定する

システムを使用するすべてのユーザーのパスを設定するには、/etc/profileファイルを編集できます。

次のようにsudoを使用する必要があります。

sudo gedit /etc/profile

geditエディターが起動したら、エクスポートコマンドをファイルの一番下に追加します。

ファイルを保存して閉じます。変更は、次回ログイン時に他のユーザーに適用されます。

セキュリティに関する注意

次のように、誤って先頭にコロン「:」を追加しないようにしてください。

追加すると、現在のディレクトリが最初に検索され、セキュリティリスクが発生します。アーカイブファイルをダウンロードしてディレクトリに解凍したとします。ファイルを見て、別の圧縮ファイルが表示されます。解凍をもう一度呼び出して、そのアーカイブを抽出します。

最初のアーカイブに悪意のある実行可能ファイルunzipが含まれていた場合、実際のunzip実行可能ファイルではなく、誤ってそのファイルが起動されます。これは、シェルが最初に現在のディレクトリを調べるためです。

したがって、exportコマンドを入力する際は常に注意してください。echo$PATHを使用して確認し、希望どおりの状態になっていることを確認してください。