shell的类型
shell的父子关系
shell的用法
shell的内建命令
5.1 shell 的类型
cat /etc/passwd
/bin/bash(bash shell)
ash shell的Debian版
对bash shell脚本来说,有两种不同的shell(默认的交互shell和默认的系统shell)
exit 退出shell
5.2 shell的父子关系
用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell。
在CLI提示符后输入 /bin/bash 命令或其他等效的 bash 命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。当输入 bash 、生成子shell的时候,你是看不到任何相关的信息的,因此需要另一条命令帮助我们理清这一切。
5.2.1 进程列表
你可以在一行中指定要依次运行的一系列命令。这可以通过命令列表来实现,只需要在命令之间加入分号(;)即可。
$ (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
进程列表是一种命令分组(command grouping)。另一种命令分组是将命令放入花括号中,并在命令列表尾部加上分号(;)。语法为 {command; } 。使用花括号进行命令分组并不会像进程列表那样创建出子shell。
echo $BASH_SUBSHELL 。如果该命令返回 0 ,就表明没有子shell。如果返回
1 或者其他更大的数字,就表明存在子shell。
后台:
要想将命令置入后台模式,可以在命令末尾加上字符 &
jobs 命令来显示后台作业信息
iobs -l 显示PID
sleep n 进程等待(睡眠)的秒数。这个命令在脚本中常
用于引入一段时间的暂停.
将相同进程列表置入后台模式
$ (sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)&
使用 tar 创建备份文件是有效利用后台进程列表的一个更实用的例子。
$ (tar -cf Rich.tar /home/rich ; tar -cf My.tar /home/christine)&
5.2.2协程:
协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。 要进行协程处理,得使用 coproc命令,还有要在子shell中执行的命令。
coproc ls
coproc My_Job { sleep 10; } --扩展语法,必须确保在第一个花括号( { )和命令名之间有一个空格。还必须保证命令以分号(;)结尾。另外,分号和闭花括号( } )之间也得有一个空格。
5.3 内建命令,外部命令
外部命令,有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令 ps 很方便显示出它的父进程以及自己所对应的衍生子进程。
type ps
which ps
type cd
内建命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。
有些命令有多种实现。例如 echo 和 pwd 既有内建命令也有外部命令。两种实现略有
不同。要查看命令的不同实现,使用 type 命令的 -a 选项。
type -a 显示出了每个命令的两种实现
which 命令只显示出了外部命令文件。
history:通常历史记录中会保存最近的1000条命令
输入 !! ,然后按回车键,就能够唤出刚刚用过的那条命令来使用。
命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。
你可以唤回历史列表中任意一条命令。只需输入惊叹号和命令在历史列表中的编号即可
!50
alias 命令是另一个shell的内建命令。命令别名允许你为常用的命令(及其参数)创建另一个名称,从而将输入量减少到最低。因为命令别名属于内部命令,一个别名仅在它所被定义的shell进程中才有效
查看当前可用的别名:
alias -p
创建别名:
alias li=‘ls -li’