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, ./的区别的主要内容,如果未能解决你的问题,请参考以下文章