【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