shell脚本常用函数和命令(2)exec详解
1)fork的概念
fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。
环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。
不管子进程的环境变量如何变化,都不会影响父进程的环境变量。
一个进程主要包括以下几个方面的内容:
1.)一个可以执行的程序
2.)与进程相关联的全部数据(包括变量,内存,缓冲区)
3.)程序上下文(程序计数器PC,保存程序执行的位置)
2)exec命令并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。
如果你在一个shell里面,执行exec ls,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,exec命令在执行时会把当前的shell process关闭。
在bash下输入man exec,找到exec命令解释处,可以看到有”No new process is created.”这样的解释,这就是说exec命令不产生新的子进程。那么exec与source的区别是什么呢?
为了避免这个影响我们的使用,一般将exec命令放到一个shell脚本里面,用主脚本调用这个脚本,调用可以用bash a.sh,(a.sh就是存放该命令的脚本),
这样会为a.sh建立一个子shell去执行,当执行到exec后,该子脚本进程就被替换成了相应的exec的命令。
3)source命令或者”.”,也不会为脚本新建shell,而只是将脚本包含的命令在当前shell执行。
source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell),source是执行shell脚本,而且执行后会返回以前的shell
4)exec功能列表
exec ls 在shell中执行ls,ls结束后不返回原来的shell中了
exec <file 将file中的内容作为exec的标准输入
exec >file 将file中的内容作为标准写出
exec 3<file 将file读入到fd3中
sort <&3 fd3中读入的内容被分类
exec 4>file 将写入fd4中的内容写入file中
ls >&4 Ls将不会有显示,直接写入fd4中了,即上面的file中
exec 5<&4 创建fd4的拷贝fd5
exec 3<&- 关闭fd3
虽然exec和source都是在父进程中直接执行,但exec这个与source有很大的区别,source是执行shell脚本,而且执行后会返回以前的shell。而exec的执行不会返回以前的shell了,而是直接把以前登陆shell作为一个程序看待,在其上经行复制
1.例:
#exec >text.txt 将输出重定向到一个文件text.txt中,即屏幕的输出都输出到text.txt中
#exec>/dev/tty 重新将输出定义到屏幕
如/dev/fd/目录下看一下:
[root@controller1 ~]#ls /dev/fd
0 1 2 255
默认会有这四个项:
0是标准输入,默认是键盘。
1是标准输出,默认是屏幕/dev/tty
2是标准错误,默认也是屏幕
255
exec 3>test 重定向到fd 3中的文件会被写在test中
exec 3>&- 关闭这个重定向
1)fork的概念
fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。
环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。
不管子进程的环境变量如何变化,都不会影响父进程的环境变量。
一个进程主要包括以下几个方面的内容:
1.)一个可以执行的程序
2.)与进程相关联的全部数据(包括变量,内存,缓冲区)
3.)程序上下文(程序计数器PC,保存程序执行的位置)
2)exec命令并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。
如果你在一个shell里面,执行exec ls,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,exec命令在执行时会把当前的shell process关闭。
在bash下输入man exec,找到exec命令解释处,可以看到有”No new process is created.”这样的解释,这就是说exec命令不产生新的子进程。那么exec与source的区别是什么呢?
为了避免这个影响我们的使用,一般将exec命令放到一个shell脚本里面,用主脚本调用这个脚本,调用可以用bash a.sh,(a.sh就是存放该命令的脚本),
这样会为a.sh建立一个子shell去执行,当执行到exec后,该子脚本进程就被替换成了相应的exec的命令。
3)source命令或者”.”,也不会为脚本新建shell,而只是将脚本包含的命令在当前shell执行。
source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell),source是执行shell脚本,而且执行后会返回以前的shell
4)exec功能列表
exec ls 在shell中执行ls,ls结束后不返回原来的shell中了
exec <file 将file中的内容作为exec的标准输入
exec >file 将file中的内容作为标准写出
exec 3<file 将file读入到fd3中
sort <&3 fd3中读入的内容被分类
exec 4>file 将写入fd4中的内容写入file中
ls >&4 Ls将不会有显示,直接写入fd4中了,即上面的file中
exec 5<&4 创建fd4的拷贝fd5
exec 3<&- 关闭fd3
虽然exec和source都是在父进程中直接执行,但exec这个与source有很大的区别,source是执行shell脚本,而且执行后会返回以前的shell。而exec的执行不会返回以前的shell了,而是直接把以前登陆shell作为一个程序看待,在其上经行复制
1.例:
#exec >text.txt 将输出重定向到一个文件text.txt中,即屏幕的输出都输出到text.txt中
#exec>/dev/tty 重新将输出定义到屏幕
如/dev/fd/目录下看一下:
[root@controller1 ~]#ls /dev/fd
0 1 2 255
默认会有这四个项:
0是标准输入,默认是键盘。
1是标准输出,默认是屏幕/dev/tty
2是标准错误,默认也是屏幕
255
exec 3>test 重定向到fd 3中的文件会被写在test中
exec 3>&- 关闭这个重定向