Linux学习——理解shell

  • shell的类型
  • shell的父子关系
  • 进程列表
  • 子shell的用法
  • 理解shell的内建命令
  • 外部命令
  • 内建命令
  • 小结


shell的类型

什么是shell
shell不单单是一种CLI。它是一个时刻都在运行的父子交互程序。

系统启动什么样的shell程序取决于你个人的用户ID配置。

默认的系统shell设置为bash shell。

Linux中常见的几种shell程序

shell

描述

bash shell

由GNU项目开发,被当作标准Unix shell——Bourne shell的替代品

ash

一种运行在内存受限环境中简单的轻量级shell,但与 bash shell 完全兼容

korn

一种与Bourne shell兼容的编程shell,但支持如关联数字和浮点运算等一些高级的编程特性

tcsh

一种将C语言中的一些元素引入到shell脚本中的shell

zsh

一种结合了bash、tcsh和korn的特性,同事提供高级编程特性、共性历史文件和主题化提示符的高级shell

shell的父子关系

用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell。
	 提供CLI提示符,等待命令输入。
	 
在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。
	被称为子shell, 也拥有CLI提示符,同样会等待命令输入。

bash 命令行参数

shell

描述

-c string

从string中读取命令并进行处理

-i

启动一个能够接收用户输入的交互shell

-l

以登录shell的形式启动

-r

启动一个受限的shell,用户会被限制在默认目录中

-s

从标准输入读取命令

可输入man bash 获得更多关于bash命令的帮助信息。

进程列表

命令列表,命令之间加入分号(;)
把所有命令包含在括号里,就成为了 进程列表。

linux命令 emulator linux命令行与shell编程_unix

要想知道是否生成了子shell,得借助一个使用了环境变量的命令。

在列表最后加入 echo $BASH_SUBSHELL。如果该命令返回0,就表明没有子shell。如果返回1或者其他更大的数字,就表明存在子shell。

linux命令 emulator linux命令行与shell编程_linux命令 emulator_02

数字1表明创建了子shell用于执行命令。

linux命令 emulator linux命令行与shell编程_后台作业_03

在命令列表中嵌套括号来创建子shell的子shell。

子shell的用法

后台模式:sleep命令

sleep命令接受一个参数,该参数是你希望进程等待(睡眠)的秒数。
这个命令在脚本中常用于引入一段时间的暂停。命令sleep 10会将会话暂停10秒钟,然后返回shell CLI提示符。
要想将命令置入后台模式,可以在命令末尾加上字符&。

linux命令 emulator linux命令行与shell编程_linux命令 emulator_04

sleep命令会在后台( &)睡眠3000秒( 50分钟)。
当它被置入后台,在shell CLI提示符返回之前,会出现两条信息。
第一条信息是显示在方括	号中的后台作业( background job)号(1)。第二条是后台作业的进程ID( 2396)。
使用jobs命令可以显示出当前运行在后台模式中的所有用户的进程。-l还可以显示出命令的PID。

linux命令 emulator linux命令行与shell编程_unix_05

进程列表是运行在子shell中的一条或多条命令。

协程:同时做两件事。

coproc命令
除了会创建子shell之外,协程基本上就是将命令置入后台模式。
屏幕显示后台作业号以及进程ID。
可以使用命令的扩展语法自己设置这个名字。


扩展语法写起来有点麻烦。
必须确保在第一个花括号( {)和命令名之间有一个空格。
还必须保证命令以分号( ;)结尾。
另外,分号和闭花括号( })之间也得有一个空格。
只有在拥有多个协程时才需要对协程进行命名,否则让coproc命令将其设置成默认名字即可。

理解shell的内建命令

外部命令

外部命令,有时也被称为文件系统命令,是存在于bash shell 之外的程序。

外部命令程序通常位于/bin、 /usr/bin、 /sbin或/usr/sbin中。

ps就是一个外部命令。可以使用 which和type命令找到它。

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

执行衍生操作是,需要花费时间和精力来设置子程序的环境。
外部命令多少还是有代价的。

内建命令

内建命令不需要使用子进程来执行,不需要外部程序文件来运行。
可以利用type命令来了解某个命令是否是内建的。
不需要通过衍生出子程序来执行,也不需要打开程序文件,内建命令的执行速度要更快,效率也更高。

history命令

查询最近用过的命令列表,可以输入不带选项的 history命令。

可以唤回并重用历史列表中最近的命令。这样能够节省时间和击键量。输入!!,然后按回车键就能够唤出刚刚用过的那条命令来使用。
命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。

linux命令 emulator linux命令行与shell编程_linux_06

history -a 可以在退出shell会话之前强制将命令历史记录写入.bash_history文件。

注意, history命令和.bash_history文件的输入是一样的,除了最近的那条history命令,因为它是在history -a命令之后出现的。

你可以唤回历史列表中任意一条命令。只需输入惊叹号和命令在历史列表中的编号即可。

命令别名

alias命令是另一个shell的内建命令。
命令别名允许你为常用的命令(及其参数)创建另一个名称,从而将输入量减少到最低。


查看命令别名:
alias -p 
使用alias 命令创建属于自己的别名:
例: alias li='ls -li'

linux命令 emulator linux命令行与shell编程_linux_07


在定义好别名后,你随时可以在shell中使用它,就算在shell脚本中也没问题。注意,因为命令别名属于内部命令,一个别名仅在它所被定义的shell进程中才有效。

linux命令 emulator linux命令行与shell编程_后台作业_08

小结

本章讨论了复杂的交互式程序: GUN bash shell。
shell进程及其关系
如何生成子shell:bash命令/使用进程列表或	coproc命令也可以产生子shell
子shell与父shell的关系
内建命令和外建命令

参考学习资料:

Linux命令行与shell脚本编程大全  第3版