ログインシェルとインタラクティブモードの話

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

bashやzshの初期化ファイルについて調べているとよく出てくるのですが、
いまいち意味が分からなかったためまとめてみました。

※覚書レベルなので間違っているかもしれません。

シェル変数と環境変数

シェル変数

子プロセスにコピーが渡されない変数(exportしない変数)のこと。
補足:エイリアスも子プロセスにコピーが渡されない

エイリアスは子プロセス(./test.sh)に引き継がれないので以下はエラーとなる。

hoge.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"ファイルが呼び出される。

参考URL

http://kanonji.info/blog/2013/06/20/bash%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B7%E3%82%A7%E3%83%AB/