Login Shell
登录主机后,在执行 Bash Script
之前,其实我们已经处于一个 BashShell
中。
这个 Shell
叫 login Shell
,是将来我们执行任何 Script
的上层环境。又叫 父SHell
其实每个帐号都可以自定义 loginShell
。以 Linux 来说,帐号的 login Shell
定义在 /etc/passwd
这个文件中。
/etc/passwd
的每一行代表一个帐号,共有7个字段,之间用 :
隔开。
帐号:x:UID 使用者代码:GID 群组代码:用户信息:主目录:login shell路径
第二栏 x
为密码栏,基于系统安全考虑,编码后的密码已经被放入 /etc/passwd
文件中。
login Shell
定义在第7个字段,如果这个字段的 Shell
程序不存在、不合法,或执行失败,则无法登录主机。
父 Shell、子 Shell
当在执行一个 Shell Script
时,父Shell
会根据 Script
程序的第一行 #!
之后指定的 Shell
程序开启一个 子Shell
环境,然后在子Shell
中执行此 Shell Script
。一旦 子Shell
中的 Script
执行完毕,此 子Shell
随即结束,回到 父Shell
中,不会影响 父Shell
原本的环境。
子Shell
环境拥有与 父Shell
相同的环境变量、标准输入、输出、错误等。
例如:
test.sh文件内容
#!/bin/bash
cd /var/www/html
命令行:
chmod +x /test.sh
命令行:
./test.sh
执行完脚本后还原到 父Shell
,并且 父Shell
并没有进入 /var/www/html目录
。
注:这是因为当执行 Shell
文件时,父Shell
会创建 子Shell
,各自独立。
如果需要使用 父Shell
来执行此脚本,可以使用:
命令行:
. ./test.sh
注意 .
与 ./
之间有一个空格符
子 Shell 继续开启子 Shell
与 父Shell
启动 子Shell
方式一样,继续调用下去,即 子Shell
开启 子Shell
。
子 Shell 能够从 父Shell 继承得来的属性如下:
- 当前工作目录
- 环境变量
- 标准输入、标准输出和标准错误输出
- 所有已打开的文件标识符
子 Shell 不能从父 Shell 继承得来的属性,归纳如下:
除了环境变量和 .bashrc
文件中定义变量之外的 Shell 变量
圆括号结构
圆括号结构能够强制将其中的命令运行在 子Shell
中,它的基本格式为:
(
command 1
command 2
…
command n
)
圆括号内的 n 条命令在 子Shell
中运行,bash 版本3之后定义了内部变量 BASH_SUBSHELL
,该变量记录了 子Shell
的层次。
子Shell
只能继承 父Shell
的一些属性,但是,子Shell
不可能反过来改变 父Shell
的属性。