Linux学习day5

  1. 理解 Shell

我们在前面已经学了初级及基础的 shell,当然我们也要学习和理解 shell 编程以及它与系统之间的关系 。


一、 Shell 类型

  • Linux 系统启动什么样的 shell 程序主要取决于个人用户的配置 。

  • /etc/passwd 文件中,在第七列字段中(原文误写为第七行)就列出了默认的 shell 程序,我们可以看一下下面的例子 。

配置示例zero Point:x: 501:501: Zeropoint Bi/home/zero Point:/bin/bash

  • 在上面的配置段中,就显示了用户 zeroPoint 使用 bash shell 作为自己的默认 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 的内建命令与外部命令

  1. 内建命令 (Built-in)
  • 内建命令就是直接长在 shell 肚子里的命令 。

  • 当我们在终端输入它时,shell 不需要去硬盘里的各种文件夹(路径)里查找对应的可执行文件,而是由 shell 内部的代码直接在内存里进行秒级处理 。

  • 与外部命令不同的是,内建命令不需要再创建子程序(子进程)来执行 。

  • 查看方法 :我们以 cd 为例,在终端输入 type cd 会输出:cd is a shell builtin

  1. 外部命令 (External)
  • 除了内建命令,其余的则是外部命令 。

  • 外部命令存在于 bash shell 之外,它并不是 shell 程序的一部分 。

  • 外部命令通常存储在 /bin/usr/bin/sbin/usr/sbin 当中 。

  • 我们可以通过 whichtype 来查看命令的存储位置 。例如输入 which ps,这样我们就可以查看 ps 命令的存储位置 。

  • 当外部命令执行的时候,会创建一个子进程,这种操作叫"衍生" 。

  • 外部命令衍生过程图解

  • 父进程 →\rightarrow→ 发出外部命令 →\rightarrow→ 衍生 →\rightarrow→ 子进程 →\rightarrow→ 子进程执行外部命令 。


五、 history 历史命令

  • history 命令会把我们敲出的每一条命令给予编号并记录下来 。

  • 语法格式如下

bash 复制代码
history [参数]
  • 参数说明如下

  • -c:清空命令的回车输入记录(即清空当前历史记录) 。

  • -d [行号]:删除指定行数的历史记录 。

  • -w :强制保存在 ~/.bash_history 文件中 。

  • -r:强制读取硬盘文件,并且同步到内存中 。

  • -a:把当前终端会话新产生的命令追加写入到历史文件中 。

相关推荐
TechPioneer_lp2 小时前
30 岁硕士 Linux C 开发背景,未来想去澳洲就业,研究方向该选 AI、SDN 漏洞还是 Linux 内核?
linux·人工智能·职业规划·澳洲求职
一楼的猫3 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作
他们叫我阿冠3 小时前
实习前自我培训-Day1学习
学习
Upsy-Daisy3 小时前
AI Agent 项目学习笔记(七):RAG 高级扩展——过滤检索、PgVector 与云知识库
人工智能·笔记·学习
_kerneler3 小时前
[qemu+kvm]: trap 寄存器脱敏优化方法
linux
柿柿快乐4 小时前
Redis 入门第一课:全局命令、内部编码与单线程模型
redis·学习·缓存·基础教学
猫猫的小茶馆4 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
Lucky_ldy5 小时前
C语言学习:文件操作
学习
嵌入式小站5 小时前
STM32 零基础可移植教程 05:按键消抖,为什么按一次会触发好几次
chrome·stm32·嵌入式硬件