理解Shell
理解Shell
shell类型
系统启动什么样的shell取决于个人ID配置,在/etc/passwd文件中,在用户ID记
录的第7个字段中列出了默认的shell程序。只要用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行。
可以直接出入命令/bin/dash 启动dash shell . exit 返回。
shell的父子关系
在CLI提示符后输入 /bin/bash 命令或其他等效的 bash 命令时,会创建一个新的shell程序。这个shell程序被称为子shell。子shell也拥有CLI提示符,同样会等待命令输入。
使用ps -f 命令来查看shell的进程。
在生成子shell进程时,只有部分父进程的环境被复制到子shell中。
判断是否生成子shell
要想知道是否生成了子shell,得借助一个使用了环境变量的命令。这个命令就是echo $BASH_SUBSHELL。如果该命令返回0,就表明没有子shell。如果返回
1或者其他更大的数字,就表明存在子shell。
探索后台模式
在后台模式中运行命令可以在处理命令的同时让出CLI,以供他用。演示后台模式的一个经典命令就是sleep。典命令就是sleep。sleep命令接受一个参数,该参数是你希望进程等待(睡眠)的秒数。这个命令在脚本中常用于引入一段时间的暂停。命令sleep 10会将会话暂停10秒钟,然后返回shell CLI提示符。
要想将命令置入后台模式,可以在命令末尾加上字符&。把sleep命令置入后台模式
使用jobs命令来显示后台作业信息。jobs可以显示当前运行在后台模式中所有用户进程。jobs -i 还可以显示进程的PID。
协程
协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。
要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令。
1 | coproc sleep 10 |
除了会创建子shell之外,协程基本上就是将命令置入后台模式。当输入coproc命令及其参数之后,你会发现启用了一个后台作业。屏幕上会显示出后台作业号(1)以及进程ID(2544)。
jobs命令能够显示出协程的处理状态。
理解shell内建命令
外部命令
也称为文件系统命令,是存在于bash shell之外的程序,他们并不是shell程序的一部分,外部命令程序通常位于/bin . /usr/bin /sbin/ 或者/usr/sbin中。
ps 就是一个外部命令,可以使用which或者type找到它。
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。
作为外部命令,PS在执行时会创建出一个子进程。
内建命令
内建命令和外部命令的区别在于前者不需要使用子进程来执行,他们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。
cd 和 exit 命令都内建于bash shell 可以利用type命令来了解某个命令是否时内建的。因为既不需要通过衍生出子进程来执行,也不需要打开程序文件,内建命令的执行速度要更快,效率也更高。要注意,有些命令有多种实现。例如echo和pwd 既有内建命令也有外部命令。两种实现略有不同。要查看命令的不同实现,使用type命令的-a选项。
history
一个有用的内建命令是history命令。bash shell会跟踪你用过的命令。你可以唤回这些命令并重新使用。
alias
alias命令是另一个shell的内建命令。命令别名允许你为常用的命令(及其参数)创建另一个名称,从而将输入量减少到最低。
1 | alias li ='ls -li' |
Linux发行版已经为你设置好了一些常用命令的别名。要查看当前可用的别名,使用alias命令以及选项-p。
在定义好别名之后,你随时都可以在shell中使用它,就算在shell脚本中也没问题。因为命令别名属于内部命令,一个别名仅在它所被定义的shell进程中才有效。
Author: corn1ng
Link: https://corn1ng.github.io/2017/10/01/理解Shell/
License: 知识共享署名-非商业性使用 4.0 国际许可协议