LinuC Level1 v10.0 対策コース(パート1)23/39
PATHの使い方
PATHの使い方について解説します。
PATH(パス)はLinuxを使いこなす上で欠かせないだけでなく、プログラミングを学習する上でもとても重要となる知識です。
コマンドサーチパス(PATH)とは?
コマンドサーチパスとはコマンドの実行ファイルを探すためのディレクトリパスのことです。このパスは環境変数PATH
に設定されます。コマンドが実行されると、シェルは環境変数PATH
に設定されたディレクトリでコマンドの実行ファイルを探します。本来、コマンドはファイルなのでフルパスで指定する必要がありますが、コマンドサーチパスを設定していればフルパスを指定しなくてもコマンドが実行できるようになります。
例えば、 何気なく利用しているls
というコマンドにも実行ファイルが存在しています。フルパスでコマンドを入力しても、ls
だけ入力しても、実行結果は同じです。
/bin/ls
file1
ls
file1
PATHの一覧を確認
環境変数PATH
の中身を表示には以下のコマンドを実行します。PATH
にコマンドのパスが登録されていることを パスが通っている といい、追加することをパスを通す といいます。
echo $PATH
/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games
PATH
は 環境変数に登録されているため、$
という記号を前に付けてecho
で出力することで、環境変数として登録されているパスの一覧を表示することができます。
whichコマンドとは?
which
は指定したコマンドのフルパスを表示してくれるコマンドです。
今回は ls
コマンドのパスを表示してみます。
which ls
/bin/ls
/bin
に存在するlsコマンドが実行されていることが分かります。つまり、このフルパス(/bin/ls
)を実行してもls
とだけ打って実行しても同じことであるということです。
また、コマンドがビルトインコマンドなのか、外部コマンドなのかも判定します。echoコマンドのパスを調べてみましょう。
which echo
echo: shell built-in command
「echo
はシェルのビルトインコマンドです」と表示されましたね。
ビルトインコマンドとは、シェルに組み込まれているコマンドであるため、パスはありません。それ以外のコマンドは外部コマンドといい、/bin
や/usr/bin
などといったバイナリを格納するディレクトリに置かれています。
which
はファイルやパッケージの保存場所を調べるときなど、このあと紹介するtype
やwhereis
に比べてかなり頻繁に使用します。
typeコマンド
type
は、機能的にはほとんどwhich
と同様です。
# findコマンドのフルパスを表示する
type find
find is /usr/bin/find
ご丁寧に「find
のパスは/usr/bin/find
です」と表示してくれます。ただし、シンプルにパスのみを表示してくれるwhich
の方がよく使われています。
whereisコマンド
whereis
はコマンドとその関連ファイルのフルパスを表示します。which
やtype
との違いは、コマンドに関連するファイルのフルパスまで表示するということです。ただし、あまり使用するケースは多くありません。
whereis ls
ls: /usr/bin/ls /mnt/c/Program Files (x86)/Gow/bin/ls.exe /usr/share/man/man1/ls.1.gz
ユーザー名:~# whereis find
オプション | 説明 |
---|---|
a | コマンドのエイリアス、フルパスを表示 |
p | コマンドのフルパスを表示 |
t | コマンドのエイリアスを表示 |
パスを通す
コマンドサーチパスを環境変数PATH
に登録することを「パスを通す」と言います。環境変数PATH
には複数のパスを登録できます。コマンドが実行されると環境変数PATH
に登録されているディレクトリを順に検索し、コマンドが見つかれば実行します。パスが通っていないコマンドを実行するとエラーになります。
では実際にパスを通してみましょう。
# 環境変数PATHを表示
echo $PATH
/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin
# export コマンドで新しくPATHを追加
export PATH=$PATH:/home/sample
# 環境変数PATHに/home/sampleが追加されている
echo $PATH
/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/home/sample
これで ls
や cat
のようにファイル名をコマンドラインで実行するだけで、/home/sample
内のコマンドやシェルスクリプトを実行することができます。
パスを通す時の注意点
パスを通す時に気を付けなればならない点があります。それはカレントディレクトリにパスを通さないということです。これはセキュリティ的に問題があるためです。
「セキュリティの大原則で余計なディレクトリにパスを通してはいけないことになっています」と言えば早いのですが、実際にカレントディレクトリにパスを通してしまうとどのようなリスクがあるのでしょうか?
具体的には、マルウェアなどの悪意のあるプログラムを実行されてしまうリスクが生じるということです。
そもそもLinuxは、複数人で使用することを前提として作られたシステムです。このとき、例えばLinuxシステムに悪意のあるユーザーが入ってきたとします。彼らがls
という名前の悪意のある実行ファイルを/tmp
や/usr/local/bin
などに置いたとすると、一般のユーザーが/tmpなどでls
とコマンドを実行したとすると、カレントディレクトリである/tmp
に置かれたその悪意のある実行ファイルが実行されてしまうことになります。
そのため、カレントディレクトリにパスを通すことは避け、カレントディレクトリのファイルを実行したい場合にはファイル名の先頭に./
をつけて実行することになっています。これは「今私のいるディレクトリのこのファイルを実行して!」というように、一時的にカレントディレクトリにパスを通してあげているイメージです。
パスを通す際は安全なディレクトリに絞って設定することが大切です。
まとめ
コマンドサーチパスについて解説しました。
コマンドサーチパスを環境変数PATH
に設定すれば、シェルがコマンドを探してくれます。それによりコマンドを入力する際はフルパスを指定せずに実行できます。環境変数PATH
にコマンドサーチパスを設定することを「パスを通す」と言います。
また、カレントディレクトリにパスを通すことは危険です。通常、コマンドサーチパスは一般ユーザーがアクセスできないディレクトリに設定することで安全性を高めています。しかし、カレントディレクトリ、つまり作業中のディレクトリにパスを通してしまうと、コマンドサーチパスが管理者以外にもアクセス可能なディレクトリに設定されることになり、悪意のあるプログラムが実行される危険性が増大します。
問題を解くためには、十分な画面サイズのPC環境をご利用下さい。