1. ホーム
  2. コース一覧
  3. LinuC Level1 v10.0 対策コース(パート1)
  4. PATHの使い方

中級

LinuC Level1 v10.0 対策コース(パート1)

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はファイルやパッケージの保存場所を調べるときなど、このあと紹介するtypewhereisに比べてかなり頻繁に使用します。

typeコマンド

typeは、機能的にはほとんどwhichと同様です。

# findコマンドのフルパスを表示する
type find
find is /usr/bin/find

ご丁寧に「findのパスは/usr/bin/findです」と表示してくれます。ただし、シンプルにパスのみを表示してくれるwhichの方がよく使われています。

whereisコマンド

whereisはコマンドとその関連ファイルのフルパスを表示します。whichtypeとの違いは、コマンドに関連するファイルのフルパスまで表示するということです。ただし、あまり使用するケースは多くありません。

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

これで lscat のようにファイル名をコマンドラインで実行するだけで、/home/sample内のコマンドやシェルスクリプトを実行することができます。

パスを通す時の注意点

パスを通す時に気を付けなればならない点があります。それはカレントディレクトリにパスを通さないということです。これはセキュリティ的に問題があるためです。

「セキュリティの大原則で余計なディレクトリにパスを通してはいけないことになっています」と言えば早いのですが、実際にカレントディレクトリにパスを通してしまうとどのようなリスクがあるのでしょうか?

具体的には、マルウェアなどの悪意のあるプログラムを実行されてしまうリスクが生じるということです。

そもそもLinuxは、複数人で使用することを前提として作られたシステムです。このとき、例えばLinuxシステムに悪意のあるユーザーが入ってきたとします。彼らがlsという名前の悪意のある実行ファイルを/tmp/usr/local/binなどに置いたとすると、一般のユーザーが/tmpなどでlsとコマンドを実行したとすると、カレントディレクトリである/tmpに置かれたその悪意のある実行ファイルが実行されてしまうことになります。

そのため、カレントディレクトリにパスを通すことは避け、カレントディレクトリのファイルを実行したい場合にはファイル名の先頭に./をつけて実行することになっています。これは「今私のいるディレクトリのこのファイルを実行して!」というように、一時的にカレントディレクトリにパスを通してあげているイメージです。

パスを通す際は安全なディレクトリに絞って設定することが大切です。

まとめ

コマンドサーチパスについて解説しました。

コマンドサーチパスを環境変数PATHに設定すれば、シェルがコマンドを探してくれます。それによりコマンドを入力する際はフルパスを指定せずに実行できます。環境変数PATHにコマンドサーチパスを設定することを「パスを通す」と言います。

また、カレントディレクトリにパスを通すことは危険です。通常、コマンドサーチパスは一般ユーザーがアクセスできないディレクトリに設定することで安全性を高めています。しかし、カレントディレクトリ、つまり作業中のディレクトリにパスを通してしまうと、コマンドサーチパスが管理者以外にもアクセス可能なディレクトリに設定されることになり、悪意のあるプログラムが実行される危険性が増大します。

問題を解くためには、十分な画面サイズのPC環境をご利用下さい。