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

#!/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

#!/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"

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

chmod +x 1.sh
chmod +x 2.sh
./1.sh fork
./1.sh source
./1.sh exec

参考文章

参考文章

相关推荐

  1. linuxsource、sh、bash、./什么区别

    2023-12-05 19:30:04       44 阅读
  2. [linux] which和find什么区别

    2023-12-05 19:30:04       34 阅读
  3. 解决方案:sql的join跟left join什么区别

    2023-12-05 19:30:04       10 阅读
  4. Linux | grep命令和 find命令什么区别

    2023-12-05 19:30:04       8 阅读
  5. equals和==什么区别

    2023-12-05 19:30:04       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 19:30:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 19:30:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 19:30:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 19:30:04       20 阅读

热门阅读

  1. Spring Boot 3.2.0 现已推出

    2023-12-05 19:30:04       43 阅读
  2. Linux驱动开发入门

    2023-12-05 19:30:04       36 阅读
  3. 爬虫框架Scrapy

    2023-12-05 19:30:04       33 阅读
  4. Ajax 是什么? 如何创建一个 Ajax?

    2023-12-05 19:30:04       36 阅读
  5. ChatGPT使用路径:从新手到专家的指南

    2023-12-05 19:30:04       60 阅读
  6. 解决PHPExcel导出一万行以上数据变空白的问题

    2023-12-05 19:30:04       38 阅读
  7. 计算机视觉各个方向概述

    2023-12-05 19:30:04       34 阅读
  8. 第8章 电信支撑网

    2023-12-05 19:30:04       30 阅读
  9. Docker 部署 Spring Boot 项目

    2023-12-05 19:30:04       30 阅读
  10. 数据管理系统-week10-自由访问控制

    2023-12-05 19:30:04       43 阅读
  11. 力扣 226.反转二叉树

    2023-12-05 19:30:04       35 阅读