bashやzshの初期化ファイルについて調べているとよく出てくるのですが、
いまいち意味が分からなかったためまとめてみました。
※覚書レベルなので間違っているかもしれません。
##シェル変数と環境変数
###シェル変数
子プロセスにコピーが渡されない変数(exportしない変数)のこと。
補足:エイリアスも子プロセスにコピーが渡されない
エイリアスは子プロセス(./test.sh)に引き継がれないので以下はエラーとなる。
#!/bin/bash
echo `hoge`
$ alias hoge='ls'
$ bash hoge.sh
./test.sh: line 3: hoge: コマンドが見つかりません
※"rc"ファイルにalias hoge="ls"
を定義していても、非インタラクティブシェルなのでエラーとなる。
###環境変数
子プロセスにコピーが渡される変数(exportする変数)のこと。
$ echo $TEST
$ export TEST=${TEST}hoge
$ echo $TEST
hoge
↓ 子プロセスを起動する。
$ bash
$ echo $TEST
hoge
$ export TEST=${TEST}hoge
$ echo $TEST
hogehoge
↓ 子プロセスを停止する。
$ exit
$ echo $TEST
hoge
$ export TEST=${TEST}hoge
$ echo $TEST
hogehoge
##ログインシェル
"/bin/bash"や"/bin/zsh"のオプションに"--login"を指定して起動した場合や、
suコマンドやsshコマンドの第一引数に"-"を指定して起動したシェルのこと(sshコマンドはデフォルトで第一引数に"-"が指定される)
ログインしたときに自動的にログインシェルが起動するが、
恐らく"/etc/passwd"ファイルからログインシェルを取得して"${シェルのパス} --login"みたいなことをしているんだろう(未確認)
また、ログインシェルとして起動しているかを確認したいならps auxf
を実行すればいい(もっといい方法あると思う)
ログインシェルとして起動していれば"-${シェル名}"と表示される。
###初期化ファイル
ログインシェルを起動すると、初期化ファイルとして"profile"ファイルが呼び出される。
実際にはもっといろいろなファイルが呼び出されるが、ディストリビューションやシェルによってまちまちなので省略する。
suコマンドで管理者になるときに一般ユーザの環境変数を引き継いでしまうので、
suコマンドは第一引数に"-"を指定して起動するのが通例("profile"が呼び出されるため、環境変数が初期化される)
$ su -
##インタラクティブモード
インタラクティブシェルと書かれている記事を見ることが多いが、
ログインシェルと同じ階層に見えるため、
インタラクティブモードと書いたほうが分かりやすい気がする。
interactive:対話式の,双方向の
引数を指定せず起動したモードのこと。ユーザの入力に対して出力をする。ようするにプロンプトのこと。
ログインシェルは自動的にインタラクティブモードになる(ログインしたときにプロンプトが出る)
$ bash
$ /bin/zsh
$ bash test.sh
$ ./test.sh
###初期化ファイル
インタラクティブモードを起動すると、初期化ファイルとして"rc"ファイルが呼び出される。