【转】http://blog.csdn.net/nash603/archive/2011/01/19/6152200.aspx
exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。
bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。
在说明exe和source的区别之前,先说明一下fork的概念。
fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。
环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。
shell script:
有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不再启用其他shell。
新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句
#!/bin/sh
一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。
另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。
source:
source命令即点(.)命令。
在bash下输入man source,找到source命令解释处,可以看到解释"Read and execute commands from filename in the current shell environment and ..."。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。
exec:
在bash下输入man exec,找到exec命令解释处,可以看到有"No new process is created."这样的解释,这就是说exec命令不产生新的子进程。那么exec与source的区别是什么呢?
exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。
分享到:
相关推荐
C语言在Linux下可以创建和管理进程,如通过fork()创建新进程,使用exec()系列函数执行新程序,通过wait()等待子进程结束。线程(pthread)编程则涉及pthread_create()、pthread_join()等函数,以实现多线程并发执行...
5. **进程和线程**:在Linux下,`fork()`创建子进程,`exec()`家族函数用来执行新的程序。`pthread_create()`和`pthread_join()`用于多线程编程。 6. **信号处理**:`signal()`和`sigaction()`函数用于处理系统发送...
常见的系统调用包括:`fork`用于创建进程,`exec`系列用于执行新程序,`wait`和`waitpid`用于等待子进程结束,`open`、`close`、`read`和`write`用于文件操作,以及`pipe`和`socket`用于进程间通信。理解并熟练运用...
5. **进程管理**:包括`fork`, `exec`, `wait`等函数,它们用于创建、控制和通信进程。源码会揭示如何在用户空间和内核空间之间切换。 6. **网络编程**:`socket`, `bind`, `connect`, `accept`等网络函数,这些是...
4. **进程与线程**:C语言在Linux中可以通过`<sys/types.h>`和`<unistd.h>`头文件中的函数来管理进程和线程,如`fork()`、`pthread_create()`等。 5. **信号处理**:`signal()`函数允许程序响应特定的系统事件,如...
_syscall0 (int, fork) // 是unistd.h 中的内嵌宏代码。以嵌入汇编的形式调用 // Linux 的系统调用中断0x80。该中断是所有系统调用的 // 入口。该条语句实际上是int fork()创建进程系统调用。 // syscall0 名称...
例如,文件I/O涉及`fopen`、`fprintf`等函数,而进程管理则会讲解`fork`、`exec`、`waitpid`等系统调用。网络编程部分可能会涉及套接字(socket)编程,如创建TCP或UDP连接、发送和接收数据。信号处理部分则会介绍...
Linux提供了一系列的系统调用来实现这些功能,例如`open()`、`read()`、`write()`用于文件操作,`fork()`、`exec()`、`wait()`用于进程控制,`signal()`处理信号,`pipe()`、`socket()`等用于进程间通信。...
在GNU/Linux环境中进行编程是一项深度探索操作系统内核、系统调用和库函数的实践。《GNU/Linux环境编程第二版》的源码提供了丰富的学习资源,让开发者能够深入了解Linux开发的各个方面。以下是一些核心知识点: 1. ...
Linux提供了丰富的系统调用来管理进程,如fork()用于创建新进程,exec()用于执行新程序,wait()用于等待子进程结束等。 3. 文件操作 Linux环境下,C语言可以通过标准库函数如fopen()、fread()、fwrite()、fclose()...
unix实验基础内容:系统调用assignments...before you download and compile the linux kernel source, make sure you have development tools installed on your system. in CentOS, install these software using yum
7. **进程与线程**:在Linux环境中,可以使用`fork`创建新进程,`exec`加载新的程序映像,`wait`等待子进程结束。多线程编程则涉及`pthread_create`, `pthread_join`等函数,用于实现并发执行。 8. **信号处理**:...
- **进程管理**:fork、exec、wait等。 **4. 主流嵌入式Linux动态扩展技术比较分析** - **动态加载**:按需加载模块。 - **热插拔技术**:设备即插即用的支持。 **5. Linux动态库剖析** - **加载机制**:动态链接...
2. **进程控制**:使用fork、exec和wait等函数创建和管理子进程,实现复杂的进程间通信。 3. **错误处理**:通过set -e选项,可以设定脚本在遇到错误时立即退出,提高脚本的健壮性。 4. **脚本调试**:使用set -x...
例如,`open()`用于打开文件,`write()`用于向文件写入数据,`fork()`创建子进程,`exec()`用于执行新的程序等。理解这些系统调用是编写系统级程序的关键。 4. **标准输入输出与文件I/O**:在C语言中,标准输入...
6. **进程和线程**:Linux是一个多任务操作系统,C语言提供了`fork`、`exec`系列函数创建和管理进程,`pthread`库用于线程操作。理解进程和线程的概念以及它们之间的关系对编写并发程序至关重要。 7. **信号和异常...
4. **系统调用**:Linux提供了丰富的系统调用接口,如`fork`用于创建子进程,`exec`系列函数用于执行新的程序,`waitpid`等待子进程结束,`pipe`和`socket`用于进程间通信。 5. **信号处理**:通过`signal`函数可以...
另外,还可以利用重定向、fork和exec等机制实现进程间的通信。 8. **正则表达式**:在Shell脚本中,正则表达式用于模式匹配和文本处理。掌握基本的正则表达式语法能帮助我们更有效地处理字符串。 9. **文件与目录...
8. **进程控制**:学习如何在Shell脚本中启动、停止、监控和管理进程,如fork、exec、wait等。 9. **函数和参数**:了解如何在脚本中定义和调用函数,以及如何传递参数给脚本和函数。 10. **错误处理和调试**:...
比如,`fork`创建子进程,`exec`系列函数执行新程序,`pipe`和`socket`实现进程间通信,`malloc`和`free`管理动态内存。 5. **信号处理**: - C语言在Linux中可以捕获和处理信号,例如`SIGINT`(中断)和`SIGTERM`...