Tuesday, December 15, 2009

交互和非交互bash shell的环境变量

关键字: non-interactive, batch

不得不说: 这很容易让人搞乱。

对batch方式的bash的环境变量不是很清楚. 这不方便日常使用, 比如cron定时运行的shell就是属于batch型shell. 这时的shell脚本变量是从哪里得到的呢? 下面解开

shell的调用方式

shell的状态有两种:
1. login shell 与non login shell
2. interactive 与 non interactive shell

提到login, 很容易想到console登陆界面。 其实, 此login非彼login。 那个叫getty, 如:
jessinio@jessinio-laptop:/tmp$ ps auxwww|grep tty
root       990  1.9  1.9  41680 29604 tty7     Ss+  Dec11 115:06 /usr/bin/X :0 -br -verbose -auth /var/run/gdm/auth-for-gdm-5hJc8s/database -nolisten tcp vt7
root      1204  0.0  0.0   1700   264 tty4     Ss+  Dec11   0:00 /sbin/getty -8 38400 tty4
root      1206  0.0  0.0   1700   264 tty5     Ss+  Dec11   0:00 /sbin/getty -8 38400 tty5
root      1211  0.0  0.0   1700   264 tty2     Ss+  Dec11   0:00 /sbin/getty -8 38400 tty2
root      1212  0.0  0.0   1700   264 tty3     Ss+  Dec11   0:00 /sbin/getty -8 38400 tty3
root      1215  0.0  0.0   1700   264 tty6     Ss+  Dec11   0:00 /sbin/getty -8 38400 tty6
root      1851  0.0  0.0   1700   264 tty1     Ss+  Dec11   0:00 /sbin/getty -8 38400 tty1

* 明显是/sbin/getty。

shell的调用方式组合共了四种:
1 . login , interactive
2. login, non-interactive
3. no login, interactive
4. no login, non-interactive

login的shell, interactive的shell

有这种选项的shell主要作用: 启动时会运行/etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile. 退出时会运行~/.bash_logout
注意:
1. x(执行)权限对于这些列出的这种脚本来说不是必需的
2. 可以使用--noprofile 去掉这种行为

启动方式: bash --login -i (-i可以省略)

nologin并且是interactive的shell

这种运行方法的shell主要作用: 启动时会运行/etc/bash.bashrc, ~/.bashrc
注意:
1 可以使用--norc去掉这种行为
2. 使用--rcfile强制只运行指定脚本

启动方式: bash -i

non-interative, no login的shell

这种状态的shell只运行BASH_ENV环境变量指向的脚本

启动方式:
1. bash -c 'shell code'
2. bash /path/to/shell/file
3. 有x权限的, 并且有shell bang的

non-interative, login的shell

运行login shell的所有脚本, 再加上BASH_ENV脚本

启动方式:
1. bash --login -c 'shell code'
2. bash --login /path/to/shell/file
3. 有x权限的, 并且有shell bang的, shell bang内加--login参数


一般情况下, 作用脚本运行的bash, 都是没有login的. 这时可以使用BASH_ENV指定一个脚本文件, 如/etc/profile
如果想使用运行者的~下的脚本的, 应该加--login

一般情况下, ~/.bash_profile会调用~/.bashrc. 这使情况更加混.




No comments:

Post a Comment

Note: Only a member of this blog may post a comment.