exec和source的简单区别

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的用法表(参考的百度)

exec cmd 执行cmd,结束后不反回原shell
exec <file file内容作为exec的stdin
exec >file exec中内容作为stdout
exec 3<file file内容读到FD3中
sort <&3 FD3读入内容被分类
exec 4>file FD4中内容写入到file
cmd >&4 cmd输出重定向到FD4
exec 5<&4 FD4走FD5的通道
exec 3<&- 关闭FD3

Example:

1、使用exec cmd

[[email protected] /]$ exec ls
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.

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.txt
[[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
[[email protected] tmp]# cat echo.txt
echo
echo.txt
haha
netstat
pass
rc
re.txt
sed_passwd
sudoers
yum.log
i did it

FD1重定向到文件,FD1重定向用exec指向到时文件echo.txt的管道,标准输出到传到文件echo.txt,最后重定向FD1到设备tty(屏幕),打印实验结果

3、使用exec控制FD0

i did it
[[email protected] tmp]# echo "echo i lovin it">echo
[[email protected] tmp]# cat echo
echo i lovin it
[[email protected] tmp]# exit

回车自动输出了exit

4、创建FD4

[[email protected] yemo]# ls /dev/fd/
0  1  2  3
[[email protected] tmp]# exec 4>4.txt
[[email protected] tmp]# ls /dev/fd/
0  1  2  3  4
[[email protected] tmp]# echo "i feel i lose my heart" >&4
[[email protected] tmp]# ls >&3
bash: 3: Bad file descriptor
[[email protected] tmp]# ls >&4
[[email protected] tmp]# exec 4>&-
[[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中,关闭管道,否则文件占用无法打开。

时间: 2024-08-09 14:40:45

exec和source的简单区别的相关文章

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

本文和大家分享的主要是linux中exec和source相关内容,一起来看看吧,希望对大家学习linux 有所帮助.  Linux种exec和.(Source)都可以同样来执行程序或者脚本,要区别二者区别,首先了解linux下的2种命令,内部命令和外部命令:  内部命令是特殊文件格式.def实现的.  外部命令是通过系统调用或者独立程序实现的.  其次shell执行脚本的时候有两种方式:  1.当前shell下执行  2.启动子shell在子shell种执行  当shell启动子shell时候,

shell中sh, exec, source, fork, ./的区别

https://www.cnblogs.com/cord/p/9226498.html shell中sh, exec, source, fork, ./的区别 1,sh sh test.sh ? sh是通过创建子进程(subshell)去执行脚本,父进程无法使用子进程中的变量,而子进程对环境变量的修改也不会影响到父进程.父进程中的局部变量子进程也无法使用,子进程会继承父进程的环境变量; ? 脚本不需要执行权限 2,exec exec + command ./test.sh exec ? 使用ex

shell 中 exec 和 source 命令解析

文章大部分来源于:http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580749.html 作为笔记留存博客备忘. exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,

linux下shell脚本执行方法及exec和source命令

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child

在Python中,val、exec和 compile 有什么区别?

基本上 eval 上用来评估一个动态生成的 Python 表达式:exec 额外的用于执行动态生成的 python 代码. eval 和 exec 有以下两个差异 eval 只接受一个表达式,exec 可以接受一个包含了 python 语句的代码块: loops, try: except:, class 以及定义的函数和方法 Python 中的表达式是任何可以作为变量赋值中的值的表达式: a_variable = (任何你可以放在这个括号内的都是一个表达式) evale 返回表达式的值,而 ex

package、folder和source folder的区别

在用myeclipse工具开发java的过程中,新建目录时发现会有package,folder和source folder等不同类型的选项, 因此在网上搜集了一些资料:如下 以下文章转自:https://blog.csdn.net/fanxiaobin577328725/article/details/54092295 前言:我使用的是Eclipse,因此示例都是以这个IDE进行演示,其他IDE应该是类同的.package.folder和source folder本质都是文件夹,只不过是处理方式

exec 跟 source 差在哪?-- Shell十三问&lt;第六问&gt;

exec 跟 source 差在哪?-- Shell十三问 这次先让我们从 CU Shell 版的一个实例贴子来谈起吧: 例中的提问是: cd /etc/aa/bb/cc 可以执行 但是把这条命令写入 shell 时 shell 不执行!这是什么原因呀! 我当时如何回答暂时别去深究,先让我们了解一下进程(process)的观念好了.首先,我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去.此一现

Android ProcessBuilder与Runtime.getRuntime().exec分别创建进程的区别

在Android中想要进行Ping,在不Root机器的情况下似乎还只能进行底层命调用才能实现. 因为在Java中要进行ICMP包发送需要Root权限. 于是只能通过创建进程来解决了,创建进程在Java中有两种方式,分别为: 1. 调用ProcessBuilder的构造函数后执行start() 2. 用Runtime.getRuntime().exec()方法执行 经过使用后发现两者有区别但是也并不是很大,两个例子说明: 1.调用ProcessBuilder的构造函数后执行start(): Pro

#define和typedef的简单区别及使用

/* ============================================================================ Name : TestDefine.c Author : lf Version : Copyright : Your copyright notice Description : #define和typedef的简单区别及使用 1 两者执行时间的差异 #define是宏定义,发生在预处理阶段,即编译之前. 它只进行简单而机械的替换,而不进