不得不说: 这很容易让人搞乱。
对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.