一.父Shell和子Shell
1.login shell和父shell
登陆主机后,在执行Script之前,我们所处的环境已经是在一个Bash Shell之中。这个Shell叫做login Shell是将来我们执行任何Script的上层环境,又叫做父shell。
2.父shell和子shell
执行某个Script时,父shell会根据script的第一行#!后指定的shell程序开启(fork)一个子shell环境,然后在子shell中执行此script。一旦子shell中的script执行完毕,此子shell随即结束,仍然回到父shell中,不影响父shell原来的环境。
3.子shell会继承父shell的若干变量值的内容,这些变量称为环境变量。
4.子shell再开启子shell——echo $SHLVL用于看第几层
二.bash的启动配置文件(在脚本中加入echo验证)
1.登陆
→/etc/profile.d/*.sh
→/etc/profile——bash login(提示符,7个shell全同)
→/etc/bashrc——all shell(bash提示符)
→~/.bashrc——all shell
→~/.bash_profile——all shell
→~/.bash_logout——bash(rm –rf /tmp/*)
2.注销
~/.bash_logout——举例history –c;poweroff
3.执行新shell
→/etc/bashrc
→~/.bashrc——末尾加exit然后ctrl+shift+t
4.执行script(使用!/bin/bash)
查BASH_ENV的内容
5.执行script(使用!/bin/sh)
不调用启动文件,没有其它检查环境变量的操作。
三.子shell会继承环境变量,不需每次启动profile
1.登陆shell
Su –;login
2.非登陆shell
su;gnome-terminal;exec-script;other
| 上下文 | 登陆shell | 交互shell |
1 | 从TTYn登shell | Ok | Ok |
2 | 从网络登陆shell | Ok | Ok |
3 | X初始化shell | Ok | Ok |
4 | X终端shell | X | Ok |
5 | 执行bash命令的子shell | X | ok |
6 | 命令替换中的子shell $(命令) | X | X |
7 | 圆括号分组的命令的子shell | X | X |
8 | 执行脚本时使用的子shell | X | X |
四.source和script的区别
1.script
script是启动一个子shell来执行命令,在script中设的变量,无法改变当前bash。
#vim auth.sh
echo “what is your name”
read name
echo “… … ok”
chmod +x auth.sh
. ./auth.sh————script
2.source
source在当前bash环境下执行命令,所以通过文件设置环境变量是要用source命令。
#vim auth.sh
echo “what is your name”
read
echo ‘your name is:’$REPLY
echo “what is your pass”
read pass
echo “… … ok”
chmod +x auth.sh
source auth.sh————source
五.环境信息配置文件bashrc与profile的区别
1.当登入系统时候获得一个shell进程时,其读取环境设定档有三步
首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如/etc/profile.d和/etc/inputrc |
然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系 |
然后在根据用户帐号读取~/.bashrc |
2.bashrc用于non-loginshell,而profile用于login shell
/etc/profile:用户登陆时,该文件仅被执行一次,并从/etc/profile.d下的文件中搜集shell的设置。 |
/etc/bashrc:用户打开新有bash shell时。有些linux版本中/etc下已经没有该文件。 |
~/. profile:专用于某个用户登录时,该文件仅仅执行一次!然后执行用户的.bashrc。 |
~/.bashrc:专用于某个用户,当该用户登录时以及每次打开新的shell时该文件被读取。 |
六.BASH分析命令行的方式
分隔管道 | 将指令切成个别的命令,以各个命令进行以下分析 |
取出token | 使用分隔字符——空格.tab将命令分成token |
替换别名 | 检查命令的第一个token是不是别名,若是则把名名替换成真正的指令 |
括号扩展 | 如{sb,b}in会扩展成sbin.bin |
~符号扩展 | 如~user2替换成/home/user2 |
替换变量 | 如$HZ替换成’Hello!’ |
替换命令 | 若token含$(which diff)的型式则把它替换成实际结果/usr/bin/diff |
替换通配符 | 如*.sh替换成foo.sh |
替换算术 | 若有算术式,则计算其结果并进行替换,如$((3+5))替换成8 |
根据函数.内置命令.搜寻路径的顺序,找寻第一个token所代表的命令位于何处。 | |
执行已替换完成的指令 |