陈斌彬的技术博客

Stay foolish,stay hungry

父 Shell 与子 Shell

Login Shell

登录主机后,在执行 Bash Script 之前,其实我们已经处于一个 BashShell 中。

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