第4章 理解shell

第4章 理解shell

4.1 shell的类型

​ 系统启动什么样的shell程序取决于你个人的用户ID配置。在**/etc/passwd**文 件中,最后一个字段列出了用户默认的shell程序。其中,bash shell最为流行

要注意在有些发行版上,默认的系统shell和默认的交互shell并不相同

4.2 shell的父子关系

​ 用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的 交互shell,是一个父shell。在这个程序上创建的新shell程序就被称为子shell

在这里插入图片描述

​ 子shell(child shell,也叫subshell)可以从父shell中创建,也可以从父shell的子shell中创建

在这里插入图片描述

1.可用 ps -f或--forest 命令查看这些shell间的嵌套结构
2.可用 exit 命令退出子shell

4.2.1 进程列表

​ 命令列表:可以在一行中指定要依次运行的一系列命令,只需在命令之间加 分号(;)

​ 进程列表:用括号把命令列表包含 (命令列表)

​ 尽管多出来的括号看起来没有什么太大的不同,但括号的加入使命令列表变 成了进程列表,生成一个子shell来执行对应的命令

说明  进程列表是一种命令分组(command grouping)。另一种命令分组是将命令放入花括号中,并在命令列表尾部加上分号(;),语法为{ command; }。使用花括号进行命令分组并不会像进程列表那样创建出子shell

​ 在shell脚本中,经常使用子shell进行多进程处理,但会明显拖慢处理速度。 在交互式的CLI shell会话中,子shell同样存在问题。它并非真正的多进程处理, 因为终端控制着子shell的I/O

4.2.2 别样的子shell用法

  1. 探索后台模式

    在后台模式中运行命令可以在处理命令的同时让出CLI

    sleep [second]    //演示后台模式经典命令
    

    要想将命令置入后台模式,可在命令末尾加上字符&

    jobs [选项]    //显示出当前运行在后台模式中的所有用户的进程
    
  2. 进程列表置入后台

    ​ 之前说过,进程列表是运行在子shell中的一条或多条命令。将进程列表置入后台模式的优势是:既可以在子shell中进行繁重的处理工作(例如用tar创建备份文件),同时也不会让子shell的I/O受制于终端

  3. 协程

    ​ 协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令

    coproc [name] { command; }   //将输入的命令置入后台模式,其中name是自己给这个作业(进程)取的名字,command是要运行的命令(注意:花括号与命令间要有一个空格,且命令要以;结尾)
    
4.3 理解shell的内建命令

4.3.1 外部命令

​ 外部命令,有时候也被称为文件系统命令,是存在于bash shell之外的程 序。外部命令通常位于**/bin、/usr/bin、/sbin/usr/sbin**中

1. which [command]    //查看命令所在的路径
2. type [选项] [命令]    //查看是内部命令还是外部命令
注意:type -a可以显示出命令的两种实现;which只显示出了外部命令文件

​ 当外部命令执行时,会创建出一个子进程。(这种操作被称为衍生

4.3.2 内建命令

​ 内建命令和外部命令的区别在于前者不需要使用子进程或借助外部程序文件 来执行,它们已经和shell编译成了一体,作为shell工具的组成部分存在,因此内 建命令的执行速度要更快,效率也更高

​ 要注意,有些命令既有内建命令也有外部命令。两种实现略有不同

窍门 对于有多种实现的命令,如果想要使用其外部命令实现,直接指明对应的文件就可以了。例如,要使用pwd的外部命令实现,可以输入/bin/pwd

4.3.3 两个有用的内建命令

  1. 历史命令

    ​ 命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。这里要注意的是,bash命令的历史记录是先存放在内存中,当shell退出时才被写入到历史文件中

history [选项]    //查看最近使用过的所有命令
  常用选项:
   -a 在退出shell会话之前强制将命令记录写入文件里
   -n 更新终端会话的历史记录(不同shell会话记录的命令不一样)
两个!!回车可以直接运行上一条命令
单个!+[编号]可以将命令从命令历史记录中被取出

​ 2.命令别名

alias [选项] [old_name='new_name']    //命令改名操作(可带选项)
  常用选项:
   -p 查看当前可用的别名
注意:因为alias属于内部命令,一个别名仅在它所被定义的shell进程中才有效。如果想让别名在不同的shell中都奏效,这需要配置环境变量
4.4 小结

​ 本章讨论了如何理解shell进程及其关系,用户登录终端时启动的默认系统shell和默认交互shell可能不同,还有后台模式的好处与坏处。

​ 最后,我们学习了两种不同类型的命令:内建命令和外部命令。

本章节涉及命令:ps、exit、sleep、jobs、coproc、which、type、pwd、history、alias
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值