时间:2017年04月10日shell
说明:本文部份内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原做者全部。《Linux命令行与shell脚本编程大全》(第三版)第五章学习总结编程
本章内容:bash
探究shell的类型 理解shell的父子关系 别出心裁的子shell用法 探究内建的shell命令
系统中启动什么样的shell程序取决于你我的的用户ID配置。在/etc/passwd文件中,在用户ID记录的第七个字段中列出了默认的shell程序。工具
默认的用户shell是bash shell,不过还有另一个默认shell是/bin/sh,它做为默认的系统shell,用于那些须要启动时使用的系统shell脚本。学习
窍门:对bash shell脚原本说,这两种不一样的shell(默认的交互shell和默认的系统shell)会形成问题。必定要阅读第十一章中有关bash shell脚本首行的语法要求,以免这些麻烦。命令行
经过输入命令bash,生成一个子shell。再执行其它命令时,会在子shell中执行。经过ps -f命令能够查看进程的父子关系,即子进程的PPID是父进程的PID。经过ps --forest命令,能够按层次查看进程。输入exit命令,退回子进程shell,回到父进程shell。exit还能用来登出当前的虚拟控制台终端。rest
base中可用的命令行参数:code
-c string:从string中读取命令并进行处理 -i:启动一个可以接受用户输入的交互shell -l:以登陆shell的形式启动 -r:启动一个受限shell,用户会被限制在默认的目录中 -s:从标准输入中读取命令
你能够在一行中指定要依次运行的一系列命令。经过分号(;)隔开便可。协程
经过使用中括号将命令列表变成进程列表。进程
命令列表:$ pwd ; ls ;cd /etc ; cd ; pwd ; ls 进程列表:$ (pwd ; ls ;cd /etc ; cd ; pwd ; ls)
要想知道是否生成了子shell,得借助一个使用了环境变量的命令。(环境变量会在第六章中详述。)这个命令就是echo $BASH_SUBSHELL。若是该命令返回0,就代表没有子shell。若是返回1或者其余更大的数字,就代表存在子shell。
在交互式的shell CLI中,还有不少更富有成效的子shell用法。进程列表、协程和管道(第十一章会讲到)都利用了子shell。在交互式shell中,一个搞笑的子shell用法就是使用了后台模式。
1.探索后台模式
在后台模式中运行命令能够在处理命令的同时让出CLI,以供他用。使用sleep命令来演示。sleep命令接受一个参数,该参数是你但愿进程等待(睡眠)的秒数。
命令:sleep
命令演示:sleep 10 演示说明:将会话暂停10秒钟,而后返回shell CLI提示符。
要想将命令置入后台模式,能够在命令末尾加上字符&。当命令被置入后台,在shell CLI提示符返回以前,会出现两条信息。第一条在方括号中表示后台做业号;第二条表示后台做业的进程ID。
命令:jobs
命令格式:jobs -l 命令说明:显示后台做业信息。能够显示当前运行在后台模式中的全部用户的进程。
窍门:须要提醒的是:后台做业的结束状态可未必会一直等到合适的时候才现身。看成业结束状态忽然出如今屏幕上的时候,你可别吃惊啊。
2.将进程列表置入后台
以前说过,进程列表是运行在子shell中的一条或多条命令。将进程列表置入后台模式会在命令输出上表现出些许不一样。
命令演示:$ (sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)& 演示说明:把进程列表置入后台模式。
把进程列表置入后台模式会产生一个做业号和进程ID,而后返回到提示符。 按一下回车键,获得另外一个提示符。
3.协程
协程能够同时作两件事。它在后台生成一个子shell,并在这个shell中执行命令。
命令:coproc
命令格式:coproc 命令 命令说明:要在子shell中执行coproc命令。
协程会建立子shell执行命令,同时,将命令置入后台模式。使用jobs能够查看后台任务。
命令格式:coproc 任务名 { 命令 } 命令说明:为后台任务指定任务名并执行。
搞明白shell的內建命令和非內建(外部)命令很是重要。內建命令和非內建命令的操做方式大不相同。
外部命令,有时候也被称为文件系统命令,是存在于bash shell以外的程序。它们并非shell程序的一部分。外部程序一般位于/bin、/usr/bin、/sbin或/usr/sbin中。ps就是一个外部命令。你可使用which和type命令找到它。
命令演示:swich ps 演示说明:查看ps命令程序所在路径。 命令演示:type -a ps 演示说明:查看ps命令程序所在路径。
当外部命令执行时,会建立出一个子进程。这种操做被称为衍生(forking)。做为外部命令,ps命令在执行时会建立出一个子进程。
內建命令和外部命令的区别在于前者不须要使用子进程来执行。它们已经和shell编译成了一体,做为shell工具的组成部分。不须要借助外部程序文件来运行。
cd和exit命令都是內建与bash shell。
命令演示:type cd 演示说明:利用type命令来了解某个命令是不是內建的。 命令演示:type -a echo 演示说明:有些命令有多种实现。使用type命令的-a选项查看命令的不一样实现。 命令演示:which pwd 演示说明:which命令只显示出了外部命令文件。
窍门:对于有多种实现的命令,若是想要使用其外部命令实现,直接指明对应的文件就能够了。例如,要使用外部命令pwd,能够输入/bin/pwd。
1.使用history命令
命令:history
命令格式:history 命令说明:查看最近用过的命令列表。一般历史记录会保存最近的1000条命令。
窍门:你能够设置保存在bash历史记录中的命令数。要想实现这一点,你须要修更名为HISTSIZE的环境变量(参见第六章)。
命令格式:history -a 命令说明:将命令历史记录写入.bash_history文件。 命令演示:!! 演示活门:执行上一条命令,即刚刚执行的命令。 命令演示:!20 演示说明:执行命令在历史列表中编号为20的命令。
2.命令别名
alias命令是另外一个shell的內建命令。命令别名容许你为经常使用的命令(及其参数)建立另外一个名称,从而将输入量减小到最低。
命令:alias
命令格式:alias -p 命令说明:查看当前可用的别名。 命令格式:alias li='ls -li' 命令说明:建立一个命令别名为li的命令,由ls -li组成。命令别名只在它被定义的shell进程中才有效。不过,可使用环境变量,使得别名在不一样的shell中都凑效。
本章讨论了复杂的交互式程序:GNU bash shell。其中包括理解shell进程及其关系,如何生成子shell,以及子shell与父shell的关系。主要介绍了bash、exit、&、sleep、jobs、coproc、which、type、history、!、alias命令。
本章学习命令我的总结以下:
bash:建立一个子shell进程 exit:退出子shell进程,直到退出CLI客户端 &:将任务置入后台模式 sleep:将当前进程等待(休眠) jobs:查看全部后台做业信息 coproc:建立一个子进程,并用子进程执行任务 which:查看命令程序所在文件路径(只显示外部命令文件) type:查看命令程序所在文件路径(经过-a选项,显示每一个命令的两种实现) history:查看命令使用的历史记录(默认1000条,可修改HISTSIZE环境变量来控制显示条数) !:执行命令历史记录里的命令(!!执行上一条命令,!n执行命令历史列表中编号为n的命令) alias:为命令建立别名(默认只在被建立的shell进行中有效,可修改环境变量实现全部shell进程有效)