shell基础知识

shell的父子关系

在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。
这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。
图解:
shell基础知识_第1张图片子shell可以进行嵌套,创造出多个shell。
可以使用exit命令,退出shell。

进程列表

要想成为进程列表,需要将一系列的命令放入括号中
(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
括号的加入使命令列表变成了进程列表,生成了一个子shell来执行对应的命令。

可以通过一个命令查看是否存在子shell。
echo $BASH_SUBSHELL
若为0则不存在子shell。
进程列表也可以进行嵌套
( pwd ; (echo $BASH_SUBSHELL))

后台模式

要想将命令置入后台模式,可以在命令末尾加上字符&。
jobs命令查看后台作业的信息(置入后台的进程)。
使用tar创建备份文件是有效利用后台进程列表的一个更实用的例子。
$ (tar -cf Rich.tar /home/rich ; tar -cf My.tar /home/christine)&
[3] 2423
$

协程

协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。
要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令。
$ coproc sleep 10
[1] 2544
$
jobs命令能够显示出协程的处理状态。
后台命令是coproc COPROC sleep 10。COPROC
是coproc命令给进程起的名字。你可以使用命令的扩展语法自己设置这个名字。

$ coproc My_Job { sleep 10; }

外部命令

外部命令,有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。
可以通过which命令找到位置,例如:
which ps

当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。
作为外部命令,ps命令执行时会创建出一个子进程。在这里,ps命令的PID是2801,父PID是2743。作为父进程的bash shell的PID是2743。
shell基础知识_第2张图片

内建命令

内建命令和外部命令的区别在于前者不需要使用子进程来执行。不需要借助外部程序文件来运行。
cd和exit命令都内建于bash shell。可以利用type命令来了解某个命令是否是内建的。
有些命令既有外部命令也有内建命令。
可以通过type -a查看,要想外部执行,直接输入文件位置即可。

history是一种内建命令,可以查看最近用过的命令列表。
输入!!
可以使用最近用过的那条命令。
!加上对应历史记录的编号即可执行对应的命令。

命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。这里要注意的是,bash命令的历史记录是先存放在内存中,当shell退出时才被写入到历史文件中。
可以在退出shell会话之前强制将命令历史记录写入.bash_history文件。要实现强制写入,需要使用history命令的-a选项。
history -a

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

查看当前可用的别名:
alias -p
使用方法:
$ alias li=‘ls -li’
直接使用li即可实现

因为命令别名属于内部命令,一个别名仅在它所被定义的shell进程中才有效。
下面是失效的例子:
$ alias li=‘ls -li’
$
$ bash
$
$ li
bash: li: command not found
$
在新的shell中别名无效。

你可能感兴趣的:(Linux,linux,shell)