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

Posted ivyharding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

? 使用exec执行脚本,被执行的脚本会继承当前shell的环境变量,exec相当于创建了新进程,它会将主进程的进程资源占用,使用主进程的pid,而exec语句执行完之后,后续的语句不再执行;
? 脚本需要执行权限

3,source

source test.sh

? 使用source或者“.”来调用外部脚本,不会产生新的进程,继承当前shell环境变量,而且被调用的脚本运行结束后,它拥有的环境变量和声明变量会被当前shell保留,类似将调用脚本的内容复制过来直接执行。执行完毕后原主shell继续运行。

? 脚本不需要执行权限

4,fork

./test fork

? 使用fork执行脚本的时候会创建一个子进程去执行该脚本,子进程会继承父进程的环境变量和声明变量。当子进程执行完毕后会返回父进程,但是父进程的环境变量不会因子进程的改变而改变。

? 脚本需要执行权限

5,./

./test.sh

? 创建一个子进程去执行脚本

? 脚本需要执行权限

 

在工作中比较常用的是 ./test.sh  或者 sh test.sh 这2个用法一致,都是重新创建了个子进程来执行脚本;

其次我会用source执行,source会继承父进程的一切,没有新建进程。

以上是关于shell中sh, exec, source, fork, ./的区别的主要内容,如果未能解决你的问题,请参考以下文章

exec和source的简单区别

【exec】shell脚本中的 exec 命令

shell bash 技巧说明 shell参数 特殊书写格式

shell脚本中的 exec 命令

shell 笔记

shell中exec命令的使用