- 理解 Shell
我们在前面已经学了初级及基础的 shell,当然我们也要学习和理解 shell 编程以及它与系统之间的关系 。
一、 Shell 类型
-
Linux 系统启动什么样的 shell 程序主要取决于个人用户的配置 。
-
在
/etc/passwd文件中,在第七列字段中(原文误写为第七行)就列出了默认的 shell 程序,我们可以看一下下面的例子 。
配置示例 :zero Point:x: 501:501: Zeropoint Bi/home/zero Point:/bin/bash
-
在上面的配置段中,就显示了用户
zeroPoint使用bashshell 作为自己的默认 shell 程序 。 -
默认的 shell 会在用户登陆 Linux 的时候启动 。说起来 Bash Shell 就是一个可执行程序,这里就不描述其他的 shell 了 。
二、 Shell 的父子关系与嵌套
1. 父子关系的基本概念
-
用于登陆 Linux 系统启动的默认 shell 是一个父 shell,然后等待命令的输入 。
-
在 CLI 提示符后输入
/bin/bash(原文误写为/bin/shell)命令或其他有效的 bash 命令时,会创建一个新的 shell 程序 。 -
这个新的程序叫做"子 shell",子 shell 同时也就拥有 CLI 提示符,同样等待命令输入 。
-
当生成"子 shell"的时候,我们看不到任何相关的信息,因此我们需要使用
ps命令来理清这一切 。
核心概念 :shell 其实就是一个进程 。
2. 环境继承与嵌套关系
-
在生成子 shell 进程的时候,只有部分父进程的环境会被继承到子 shell 中 。
-
当然 shell 也可以进行嵌套,例如我们在父级 Shell 中输入三次
bash,就创建了三次嵌套的 shell 。 -
子 shell 的嵌套关系图解 :
父 shell →\rightarrow→ 发出命令 "bash" →\rightarrow→ bash 子 shell →\rightarrow→ 发出命令 "bash" →\rightarrow→ bash 孙 shell →\rightarrow→ 发出创建命令 →\rightarrow→ bash 曾孙 shell
三、 Bash Shell 启动参数与受限模式
Bash shell 程序可使用参数修改 Shell 的启动方式,参数说明如下 :
-
-c参数 :让 shell 不进入等待回车输入的交互界面,执行完成后立即退出 。例如:bash -c "echo 'Hello world'"。 -
-i参数(原文简写为"一"):强制 shell 启动为一个交互式终端,强制性读取用户的输入 。 -
-l参数(原文简写为"一"):让 shell 强装自己是系统启动、用户刚通过密码登陆时的状态,会完整地去加载整个系统的环境配置文件 。 -
受限模式权限限制 (通常为
-r参数):极大限制用户的操作权限,表现如下 : -
① 无法使用
su切换用户身份 。 -
② 无法修改
PATH环境变量 。 -
③ 无法使用包含
/的外部命令 。 -
④ 无法使用
>与>>定向输出(重定向) 。
注 :exit 命令在某些特定受限状态下可能无法用来退出子 shell 。
四、 理解 Shell 的内建命令与外部命令
- 内建命令 (Built-in)
-
内建命令就是直接长在 shell 肚子里的命令 。
-
当我们在终端输入它时,shell 不需要去硬盘里的各种文件夹(路径)里查找对应的可执行文件,而是由 shell 内部的代码直接在内存里进行秒级处理 。
-
与外部命令不同的是,内建命令不需要再创建子程序(子进程)来执行 。
-
查看方法 :我们以
cd为例,在终端输入type cd会输出:cd is a shell builtin。
- 外部命令 (External)
-
除了内建命令,其余的则是外部命令 。
-
外部命令存在于 bash shell 之外,它并不是 shell 程序的一部分 。
-
外部命令通常存储在
/bin、/usr/bin、/sbin、/usr/sbin当中 。 -
我们可以通过
which或type来查看命令的存储位置 。例如输入which ps,这样我们就可以查看ps命令的存储位置 。 -
当外部命令执行的时候,会创建一个子进程,这种操作叫"衍生" 。
-
外部命令衍生过程图解 :
-
父进程 →\rightarrow→ 发出外部命令 →\rightarrow→ 衍生 →\rightarrow→ 子进程 →\rightarrow→ 子进程执行外部命令 。
五、 history 历史命令
-
history命令会把我们敲出的每一条命令给予编号并记录下来 。 -
语法格式如下 :
bash
history [参数]
-
参数说明如下 :
-
-c:清空命令的回车输入记录(即清空当前历史记录) 。 -
-d [行号]:删除指定行数的历史记录 。 -
-w:强制保存在~/.bash_history文件中 。 -
-r:强制读取硬盘文件,并且同步到内存中 。 -
-a:把当前终端会话新产生的命令追加写入到历史文件中 。