Shell
Linux 作为一个操作系统,称为 kernel,一般用户不能直接使用 kernel,而通过 kernel 的外壳程序 Shell 和 kernel 进行沟通。
Shell 作为外壳程序,包裹在 Linux 内核外层,是一个应用程序,通过一系列的 Linux命令对操作系统 发出相关治疗提供人际界面。它连接了用户和 Linux 内核,让用户更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。bash 是 Shell 的一种。

Shell 命令的执行过程:

1.shell类型
which bash 查找bash shell
# /bin目录是/usr/bin目录的**符号链接**
# CentOS默认的系统shell指向bash shell
# Ubuntu默认的系统shell指向dash shell
echo $0 显示当前shell名称
# 输出:-bash,"**-**"表示该shell是用户的登录shell
exit 退出shell程序(快捷键Ctrl+D)
2.shell父子关系
用户登录某个虚拟控制台所启动的默认交互式shell(登录shell)是父shell,
在CLI提示符处输入bash命令(或其他shell程序名)时会创建新的shell程序,为子shell。
ps -H 或 ps f 或 ps --forest 可以用来查看shell间的嵌套结构。bash -l将某个shell作为登录shell使用。
2.1进程列表
可以在单行中指定要依次运行的一系列命令,命令之间用分号(";")隔开。
命令分组:
(1)将命令列表放入圆括号内"( )"就是进程列表,进程列表生成了一个子shell来执行命令列表。
(2)将命令列表放入花括号内"{ }",命令列表以分号(";")结尾,语法为{command;},不会创建子shell。
echo $BASH_SUBSHELL 输出环境变量的值来判断是否生成子shell
# 返回值为0则没有子shell,返回值为1或其他更大的数字,则存在子shell
可以在进程列表中嵌套( )来创建子shell的子shell。
2.2后台模式
2.2.1 sleep
sleep命令在shell脚本中常用于引入一段暂停时间,可以在命令末尾加上字符"&"将命令置入后台模式。
例:

sleep命令会在后台(&)睡眠300秒,并返回两条信息,第一条为后台作业号(2),第二条是后台作业进程ID(1349)。
2.2.2 jobs
jobs命令能够显示当前运行在后台模式中属于你的所有进程(作业)。
例:

jobs命令会在方括号中显示作业号(2),还有作业的当前状态(Done)以及对应的命令(sleep 300)。
jobs -l还会显示命令的PID,如果运行多个后台进程,在jobs命令显示中,最近启动的作业在其作业号前会有+,在它之前启动的进程则以-表示。
通过将进程列表置入后台,可以在子shell中进行大量的多进程处理,优点是终端不再和子shell的I/O绑定。
2.2.3 coproc
使用coproc命令进行协程处理,协程同时做两件事:一是在后台生成一个子shell并将命令置入后台,二是在该子shell中执行命令。jobs命令可以显示协程的状态。
例:

coproc扩展语法可以设置协程名,默认为COPROC ,使用拓展语法,必须在{和内部命令之间有一个空格,内部命令必须以;结尾,并且;和}之间也得有一个空格。
3.外部命令和内建命令
3.1外部命令
外部命令(又称文件系统命令)是存在于bash shell之外的程序,通常位于/bin,/usr/bin,/sbin或/usr/sbin目录中。每当执行外部命令时,就会创建一个子进程,这种操作叫衍生(forking)。只要涉及进程衍生,就需要耗费时间和资源来设置新子进程环境,所以系统开销较高。无论是衍生出子进程还是创建子shell,都仍然可以通过信号互通。
3.2内建命令
内建命令和shell编译成一体,作为shell的组成部分存在,不需要衍生子进程,所以执行速度更快,效率更高,系统开销较低。
比如cd和exit命令都内建于bash shell,用type命令判断其是否为内建命令。

有些命令有多种实现,使用type -a查看命令的不同实现。

3.2.1 常用内建命令一:history
查看最近使用的命令列表,输入!!,然后按Enter键,重用最近那条命令,输入!n,重用第n条命令。
可以设置保存在bash历史记录中的命令数量,需修改名为HISTSIZE的环境变量。
命令历史记录保存在用户主目录的隐藏文件.bash_history中。在CLI会话期间,bash命令的历史记录被保存在内存中,当shell退出时才被写入历史文件使用history -a,可以在不退出shell的情况下强制将命令历史记录写入.bash_history文件。如果打开多个终端会话,想要强制重新读取,可以使用history -n。如果需要清除命令历史,输入history -c即可,接下来再输入history -a,并清除.bash_history文件。
3.2.2 常用内建命令二:alias
使用命令别名,允许为常用命令及其参数创造另一个名称,alias -p可以查看当前可用的别名,unalias alias-name可以删除指定别名(如果被删除的别名不是你设置的,那么等下次重新登录系统时,该别名会再次出现,可以修改环境文件永久删除某个别名)。
需要注意的是,命令别名属于内建命令,所以别名仅在其被定义的shell进程中有效。
优先级:别名>内部命令>hash缓存>外部命令(绝对路径)
别名不要使用已经有的命令

2658

被折叠的 条评论
为什么被折叠?



