- 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を使用して確認し、希望どおりの状態になっていることを確認してください。
コメントする