Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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/

akata
東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです,Blog: https://akataworks.hatenadiary.jp/
http://akataworks.hatenadiary.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away