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 的属性。