linux里source、sh、bash、./有什么区别

1、source

source a.sh

在当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限"

source命令可以简写为"."
. a.sh

注意:中间是有空格的。

2、sh/bash

sh a.sh
bash a.sh

都是打开一个subshell去读取、执行a.sh,而a.sh不需要有"执行权限"

通常在subshell里运行的脚本里设置变量,不会影响到父shell的。

3、./

chmod +x a.sh
./a.sh

打开一个subshell去读取、执行a.sh,但a.sh需要有"执行权限"

可以用chmod +x添加执行权限

另外,使用./来执行的文件里有alias语句的话,shell并不会把alias别名扩展成对应的命令,要解决的话,得使用shopt命令来开启alias扩展选项
shopt -s expand_aliases

4、fork、source、exec

  • 使用fork方式运行script时, 就是让shell(parent process)产生一个child process去执行该script,当child process结束后,会返回parent process,但parent process的环境是不会因child process的改变而改变的。
  • 使用source方式运行script时,就是让script在当前process内执行, 而不是产生一个child process来执行。由于所有执行结果均于当前process内完成,若script的环境有所改变, 当然也会改变当前process环境了。
  • 使用exec方式运行script时,它和source一样,也是让script在当前process内执行,但是process内的原代码剩下部分将被终止。同样,process内的环境随script改变而改变。
  • 通常如果我们执行时,都是默认为fork的。

实践

为了实践下,我们可以先建立2个sh文件,以下代码来自ChinaUnix的網中人

1.sh

bash 复制代码
#!/bin/bash
A=B
echo "PID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh: \$A is $A"
case $1 in
    exec)
        echo "using exec..."
        exec ./2.sh ;;
    source)
        echo "using source..."
        . ./2.sh ;;
    *)
        echo "using fork by default..."
        ./2.sh ;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh: \$A is $A"

2.sh

bash 复制代码
#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh: \$A is $A"

按如下步骤运行查看结果:

bash 复制代码
chmod +x 1.sh
chmod +x 2.sh
./1.sh fork
./1.sh source
./1.sh exec

参考文章

参考文章

相关推荐
t198751283 小时前
在Ubuntu 22.04系统上安装libimobiledevice
linux·运维·ubuntu
skywalk81633 小时前
linux安装Code Server 以便Comate IDE和CodeBuddy等都可以远程连上来
linux·运维·服务器·vscode·comate
晚风吹人醒.4 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
Hard but lovely4 小时前
linux: pthread库的使用和理解
linux
这儿有一堆花6 小时前
Kali Linux:探测存活到挖掘漏洞
linux·运维·服务器
松涛和鸣6 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法
皮小白7 小时前
ubuntu开机检查磁盘失败进入应急模式如何修复
linux·运维·ubuntu
邂逅星河浪漫8 小时前
【CentOS】虚拟机网卡IP地址修改步骤
linux·运维·centos
hhwyqwqhhwy8 小时前
linux 驱动开发相关
linux·驱动开发
IT逆夜8 小时前
实现Yum本地仓库自动同步的完整方案(CentOS 7)
linux·运维·windows