功能描述
Linux exec命令用于调用并执行指定的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。
命令语法
exec [选项]
选项含义
选项 | 含义 |
---|---|
-c | 使用一个空环境来执行 |
-a | shell会将名字作为零参数传递给执行的命令 |
-l | 在shell的开头放置一个破折号参数传递给命令 |
参考实例
实例1
// 首先使用echo命令将文本“www.linuxyz.cn”进行输出:
[root@bunian ~]# echo www.bunian.cn
www.bunian.cn
// 然后再使用exec命令调用echo命令输出同样的信息,并且对输出的信息进行对比,输入指令如下所示:
[root@bunian ~]# exec -c echo www.bunian.cn
www.bunian.cn
// 通过比较两者执行后的结果来看,所实现的功能是相同的,即使用exec命令调用echo命令成功。
实例2
// 查找bunian.txt 并备份为bunian.txt.bak
[root@bunian ~]# find /test -name "bunian.txt" -exec cp {} {}.bak \;
知识扩展
一、系统调用 exec 是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
一个进程主要包括以下几个方面的内容:
二、exec是一个函数簇,由6个函数组成,分别是以excl和execv打头的。
执行exec系统调用,一般都是这样,用fork()函数新建立一个进程,然后让进程去执行exec调用。我们知道,在fork()建立新进程之后,父进各与子进程共享代码段,但数据空间是分开的,但父进程会把自己数据空间的内容copy到子进程中去,还有上下文也会copy到子进程中去。而为了提高效率,采用一种写时copy的策略,即创建子进程的时候,并不copy父进程的地址空间,父子进程拥有共同的地址空间,只有当子进程需要写入数据时(如向缓冲区写入数据),这时候会复制地址空间,复制缓冲区到子进程中去。从而父子进程拥有独立的地址空间。而对于fork()之后执行exec后,这种策略能够很好的提高效率,如果一开始就copy,那么exec之后,子进程的数据会被放弃,被新的进程所代替。