Linux中的exec和source有什么区别呢?

本文和大家分享的主要是linux中exec和source相关内容,一起来看看吧,希望对大家学习linux 有所帮助。 
Linux种exec和.(Source)都可以同样来执行程序或者脚本,要区别二者区别,首先了解linux下的2种命令,内部命令和外部命令: 
内部命令是特殊文件格式.def实现的。 
外部命令是通过系统调用或者独立程序实现的。 
其次shell执行脚本的时候有两种方式: 
1、当前shell下执行 
2、启动子shell在子shell种执行 
当shell启动子shell时候,通过fork创建进程子进程,首先子进程会继承父进程的很多属性,而非共享,再复制了父进程数据之后,2者就基本没有关系了,简单表示就是 父进程属性→子进程。fork函数和一般的函数不同,在他成功创建出子进程之后会返回两个值,一个返回给父进程中的pid变量(值为子进程ID),一个返回给自进程中的pid变量(值为0)当然,如果fork失败了,则只需要返回给父进程pid变量一个-1(子进程不存在)。子进程确实复制了父进程的数据,叫做继承了父进程的部分属性,这样一来,子进程和父进程中的变量就不是同一个变量了。 
在shell种脚本得的第一行通常是/bin/bash,这种方式就是使用subshell执行,见《shell脚本编程》p36。当shell打开一个可执行文件时,系统调用fork创建进程,用于执行程序,内核执行飞编译程序 
返回错误"NOT excutable format file”,shell收到错误信息启动一个新shell(shell副本)来执行, 
#!(shabang)用于告诉内核使用哪个shell来执行。 
现在我们查看系统帮助文档怎么介绍的: 
source (.): 
Read and execute commands from  filename in the  current  shell 
environment  and return the exit status of the last command exe- 
cuted from filename. 
exec : 
If command is specified, it replaces the shell.  No  new  process 
is  created. 
由此可见source执行的时候是当前shell环境下执行,执行完成后把状态返回给当前shell。 
exec执行时候会关闭当年shell进程,并且fork一个相同pid的shell进程来执行,系统调用新的exec的process来替代原来的进程执行。从表面上看没有新的进程创建,原来进程的代码段、数据段、堆栈都被新的process所代替。 
exec系统调用过程 
fork()执行创建一个new_process,程序执行exec系统调用,fork()执行后父子进程共享代码段,数据空间分开,父进程copy自己的数据空间内容和上下文到子进程。采用写时copy的策略:在创建子进程时不会不copy父进程的地址空间,共用,当子进程写入数据时,这时候copy空间到子进程,这种策略提高效率并且执行fork()完执行exec后,子进程的数据会被新的进程代替。 
文件描述符FD(file-descriptor) 
文件在打开时候系统给每一个打开的文件分配用于维护的描述符,这通常包括系统打开文件描述符表,进程级的文件描述符表(文件操作符标志和文件句柄的引用),文件系统i-node表。(以后会单独写一个对内核源码的解释) 
exec的用法表 
  
Example: 
1、使用exec cmd 
[[email protected] /]$ exec ls #ls 替换掉当前shell进程 
bin   dev  home  lib64       media  opt   root    selinux  sys  usr 
boot  etc  lib   lost+found  mnt    proc  sbin srv  tmp  var 
 
Connection closed by foreign host.   #shell已经被ls替代,ls执行完成进程结束退出 
 
Disconnected from remote host(cent6mini_eth0) at 03:59:43. 
 
Type `help’ to learn how to use Xshell prompt. 
[c:\~]$ 
执行完成后关闭了shell 
2、使用exec控制FD1(stdout) 
[[email protected] tmp] # echo ’im lovin it’> echo.txt      #简单的输出重定向 
[[email protected] tmp] # echo echo.txt 
echo .txt 
[[email protected] tmp] # ls /dev/fd/ 
0  1  2  3 
[[email protected] tmp] # exec >echo.t             #把当前所有stdout定向到文件 
[[email protected] tmp] # ls 
[[email protected] tmp] # echo "i did it" 
[[email protected] tmp] # cat echo.txt 
cat : echo .txt: input file is output file #打开会死循环系统保护           
[[email protected] tmp] # exec >/dev/tty            #把stdin重新定向会屏幕(tty设备) 
[[email protected] tmp] # cat echo.txt             #正常输出内容 
echo 
echo .txt 
haha 
netstat 
pass 
rc 
re.txt 
sed_passwd 
sudoers 
yum.log 
i did it 
4、创建一个FD4 
[[email protected] yemo] # ls /dev/fd/ 
0  1  2  3 
[[email protected] tmp] # exec 4>4.txt                       #生成一个文件描述符fd4指向文件 
[[email protected] tmp] # ls /dev/fd/       
0  1  2  3  4 
[[email protected] tmp] # echo "i feel i lose my heart" >&4   #把流通过fd4到文件中 
[[email protected] tmp] # ls >&4       
[[email protected] tmp] # exec 4>&-                                 #关闭fd4 
[[email protected] tmp] # cat 4.txt 
i feel i lose my heart 
4.txt 
echo 
echo .txt 
haha 
netstat 
pass 
rc 
re.txt 
sed_passwd 
sudoers 
yum.log 
exec创建FD4指向文件4.txt,系统创建了FD4管道,通过管道4的内容到会传到文件4.txt中,关闭管道,否则文件占用无法打开。

来源: Linux公社

时间: 2024-08-06 13:42:54

Linux中的exec和source有什么区别呢?的相关文章

在linux中,rpm和yum有什么区别?

rpm就是安装一个指定的包,但如果包存在依赖性关系,就是安装A包,需要先安装B包,采用rpm就要先安装B,再安装A:而yum能自动检测包之间的依赖关系,可以直接yum安装A,yum检测到A与B 的依赖关系,自动安装B: Linux中的rpm 英文原义:RPM  Package  Manager         中文释义:RPM软件包管理器 注解:一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件. RPM是RedHat软件包管理工具的缩写,这一文

linux中ctrl+z和ctrl+c的区别

ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.例如:当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得存盘推出,你可以简单的按下ctrl+z,shell会将vi进程挂起~,当你结束了那个shell操作之后,

exec和source的简单区别

Linux种exec和.(Source)都可以同样来执行程序或者脚本,要区别二者区别,首先了解linux下的2种命令,内部命令和外部命令: 内部命令是特殊文件格式.def实现的. 外部命令是通过系统调用或者独立程序实现的. 其次shell执行脚本的时候有两种方式: 1.当前shell下执行 2.启动子shell在子shell种执行 当shell启动子shell时候,通过fork创建进程子进程,首先子进程会继承父进程的很多属性,而非共享,再复制了父进程数据之后,2者就基本没有关系了,简单表示就是

Linux中 tail -f;tail -F;tailf的区别

在Linux中,tail -f;tail -F;tailf的区别. tail -f      等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 tail -F     等同于--follow=name  --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪 tailf        等同于tail -f -n 10(貌似tail -f或-F默认也是打印最后10行,然后追踪文件),与tail

linux中cat、more、less命令区别详解

众所周知linux中命令cat.more.less均可用来查看文件内容,主要区别有:cat是一次性显示整个文件的内容,还可以将多个文件连接起来显示,它常与重定向符号配合使用,适用于文件内容少的情况:more和less一般用于显示文件内容超过一屏的内容,并且提供翻页的功能.more比cat强大,提供分页显示的功能,less比more更强大,提供翻页,跳转,查找等命令.而且more和less都支持:用空格显示下一页,按键b显示上一页.下面详细介绍这3个命令. cat [plain] view pla

linux中cat more less head tail 命令区别

1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 比如:[[email protected] ~]# cat /etc/fstab 为了便于新手弟兄灵活掌握这个工具,我们多说一点常用的参数:1.0 cat 语法结构: cat [选项] [文件]... 选项  -A, --show-all           等价于 -vET  -b, --number-nonblank    对非空输出行编号 

Linux中两种脚本执行方式的区别:. xx 和 ./xx

今天继续在看Building Linux Embedded Systems一书,进入第四章,有一些实际的操作,其中在介绍了良好的组织架构(文件夹)后,建议些一个script可以进行不同的开发环境.里面很简单,包括一个export和cd的命令,这个脚本假设为 export PROJECT=/home/aaa/project1 cd $PROJECT 并取名字为 test 我执行$ ./test,发现没有效果,然后在里面增加两个跟踪语句,如下 export PROJECT=/home/aaa/pro

linux中mnt,media以及dev目录的区别

前几天手贱,一不小心把/usr给删掉了.于是刻了个backtrack3的启动盘,进去系统备份.我用mount /dev/sda6 /mnt/home挂载了home,然后tar cf /mnt/usb0/bak.tar /mnt/home备份.备份完了后,我在backtrack3中的虚拟目录到处逛,忽然,我发现/media目录下也有一个home文件夹,打开一看,发现与/mnt/home一模一样!原来,/mnt目录存放手动挂载的硬件,/media目录存放自动挂载的硬件(载点都是由系统自动建立和删除的

Linux中进程与线程的概念以及区别

linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题.无论你是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.对于一般的程序员,搞清楚二者的概念并在工作中学会运用是其思考的主要问题:对于资深工程师,如何在系统层面实现两种技术及其各自的性能和实现代价是其思考的主要问题.由此可见进程和线程在IT界的重要地位. 进程和线程是操作系统的基本概念,它们之间既有区别又有联系.从定义来看,它们比较抽象,很难理解.今天给大家打个比方,教大家用类比的方法去理解它,掌握它.其实,