コマンドファイルについて

Linuxコマンドはディレクトリツリーのどこかにファイルとして存在している。
例えば、lsコマンドは/bin/lsに格納されている。
ただ、/bin/lsとコマンドパスを打たなくても、lsと打つだけでコマンドが実行される。
これは$PATHというシェル変数(シェル内部で使用される変数のこと)に設定された場所から自動的にコマンドを探してくれるためである。
シェルがコマンドを探す場所は下記のようにして確認することができる。

$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/bin:/sbin/
// コマンドを探すディレクトリを:で連結した結果が表示される

whichコマンドはコマンドパスを教えてくれる。

$ which cat
// /bin/cat

外部コマンドと組み込みコマンド

ちなみにコマンドファイルがあるコマンドを外部コマンド、シェル自体に組み込んでいるコマンドを組み込みコマンドと呼ぶ。
判断するにはtypeコマンドを使用する。

$ type cat
cat is /bin/cat
$ type set
set is a shell builtin

外部コマンドは、シェルの外部で実行されるため、現在設定されているシェル変数を参照することができない。

// シェル変数を設定
$ var1='test'
// シェル変数を出力
$ echo $var1
test
$ ls $var1
// うまく動作しない

$PATHなどのシェル変数が外部コマンドから参照できるのは、環境変数として設定しているからである。
下記のコマンドで環境変数の一覧を確認できる。

$ printenv

環境変数の設定方法

環境変数を設定するにはexportコマンドを使用する。

// シェル変数を設定
$ TEST='test'
// 設定したシェル変数を環境変数にする
$ export TEST
// 上記の2つのコマンドを一度に設定する場合
$ export TEST='test'

環境変数の永続化について

シェル変数、環境変数を上述の方法で設定しても、シェルを終了するとすべての設定が消えてしまう。
永続化するには、シェルの設定ファイルに設定内容を記載する必要がある。
bashの場合は、/etc/profile、~/.bash_profile、~/.bashrcのいずれか。
bash起動時はまず /etc/profile が読み込まれ、次に ~/.bash_profile、~/bash_profileにだいたい~/.bashrcを読み込む設定になっていることが多い。
そのため、~/.bashrc に基本的に記述する。
各役割の詳細は下記。

  • /etc/profile:システム全体で使用する設定ファイル(すべてのユーザーに共通の設定を行う場合に利用する)
  • ~/.bash_profile:各ユーザーの個別の設定ファイル
  • ~/.bashrc:非ログインシェル(コマンドライン上でbashと入力してシェルを起動した場合)で読み込まれる各ユーザーの個別の設定ファイル
// bashの場合
$ vi ~/.bashrc
-----
export TEST='test'
-----
$ souce ~/.bashrc
$ ls $TEST