【Linux基礎】コマンドとPATH
コマンドとは
コマンドの種類
typeコマンドを使用すると、コマンドの種類を調べることができます。
- 組み込みコマンド
type echo
# echo is a shell builtin
- 外部コマンド
type cat
# cat is /usr/bin/cat
外部コマンドとは
外部コマンドとは、シェルの外部に存在する実行可能なファイルです。例えば、catのコマンドの場所を調べてみましょう。
ls -l /usr/bin/cat
# -rwxr-xr-x 1 root root 43416 Sep 5 2019 /usr/bin/cat
このように、catコマンドを実行すると、実際には/usr/bin/catという実行可能なファイルが実行されていると言うことが分かります。
fileコマンドでこのファイルの種類を調べることができます。
file /usr/bin/cat
# /usr/bin/cat: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b357ed53c8c9cb1a312f83b28982304effae0135, for GNU/Linux 3.2.0, stripped
この出力されている内容は難しいですが、要約すると、/usr/bin/catはLinuxのx86-64アーキテクチャ用の実行可能なバイナリファイルということです。
外部コマンドの実行の仕組み
シェル(bashなど)は、外部コマンドを実行する際に、そのコマンドの実行ファイルの場所をPATH環境変数にリストされているディレクトリから探します。
- PATH環境変数の確認
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
コマンドの場所が一度見つかると、シェルはその場所を「ハッシュ」し、次回の実行が速くなるようにその情報を内部に保存します。
どういうことか、実際にcatを実行してみます。
# hello.txtを作成
echo hello world > hello.txt
ls
# hello.txt
cat hello.txt
# hello world
再度typeでcatを調べます。
type cat
# cat is hashed (/usr/bin/cat)
このように、一度catを使用したことでcatがハッシュされたことが分かります。ちなみに、ハッシュされたコマンドは以下のように調べることができます。(lsも外部コマンドです。)
hash
# hits command
# 4 /usr/bin/ls
# 3 /usr/bin/cat
PATHとは
先ほどPATH環境変数と軽く触れましたが、catが/usr/bin/catという場所に存在するのにcatと叩くだけで実行される理由について説明していきます。
本来ファイルを実行させるためには相対、または絶対パスでファイルパスを指定する必要がありますよね。なので、catは以下のコマンドでも実行することができます。(当たり前ですが。)
/usr/bin/cat hello.txt
# hello world
シェルが外部コマンドを実行する仕組みで説明したように、シェルはPATH環境変数にリストされているディレクトリを探します。/usr/bin/catをcatとして実行するためにはcatが存在するディレクトリをPATH環境変数に登録する必要があるということです。これが良く言われるPATHを通すということです。
PATHの通し方は、以下のように行います。
export PATH=/usr/bin:$PATH
これで/usr/binに存在する実行ファイルまでのPATHを通すことができます。ターミナル上で実行すると、一時的(現在のセッションのみ)にPATHが通されます。恒久的に追加する場合は.bashrcなどのシェルの設定ファイルに追加する必要があります。
まとめ
外部コマンドとは、誰かが作ったコマンドを実行しているだけ、ということです。Linux自体もOSSですし、作って頂いた方に敬意を払いつつコマンドを叩いていこうと思います。
Discussion