1.子进程和协程
1.子进程:
执行下面这两行命令是不一样的结果,括号的加入使命令列表变成了进程列表,生成了一个子shell来执行对应的命令.
$ pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls;
$ (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
想知道是否生成了子shell(现在生成的子shell的个数),得借助一个使用了环境变量的命令:
echo $BASH_SUBSHELL
2.协程
协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。要进行协程处理,得使用coproc命令,加要在子shell中执行的命令.例如:
$ coproc sleep 10
除了会创建子shell之外,协程基本上就是将命令置入后台模式。当输入coproc命令及其参数之后,你会发现启用了一个后台作业。屏幕上会显示出后台作业号(1)以及进程ID
可以使用命令的扩展语法自己设置这个名字。
$ coproc My_Job { sleep 10; }
可以发挥才智,将协程与进程列表结合起来产生嵌套的子shell。只需要输入进程列表,然后把命令coproc放在前面就行了。
$ coproc ( sleep 10; sleep 2 )
使用ps --forest
看进程的从属关系
但生成子shell的成本不低,而且速度还慢。创建嵌套子shell更是火上浇油!
2.外部命令和内建命令
1.外部命令
有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。ps就是一个外部命令。你可以使用which和type命令找到它。
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。
可以看到
ps -f
的PPID是 -bash
的PID,也就是说ps -f
是-bash
的子进程,是ps -f
是-bash
衍生的
2.内建命令
内建命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。
cd和exit命令都内建于bash shell。可以利用type命令来了解某个命令是否是内建的。
$ type cd
cd is a shell builtin
$ type exit
exit is a shell builtin
对于有多种实现的命令,如果想要使用其外部命令实现,直接指明对应的文件就可以了。
例如,要使用外部命令pwd,可以输入/bin/pwd。
3.一些Linux小技巧
1.输入!!
,然后按回车键就能够唤重新使用刚刚用过的那条命令
2.history -a或-w: 把缓存中的输入历史写入 ~/.bash_history中
- !$
查看网卡配置文件内容
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
下面的'!$'代表上一条命令的最后一个参数,也就是/etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# vi !$
参考文献:
Linux命令行与shell脚本编程大全.第3版(布鲁姆,布雷斯纳汉)
网友评论