当前位置: 首页 > article >正文

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

参考文章

参考文章


http://www.kler.cn/a/160736.html

相关文章:

  • 【前端学习指南】Vue computed 计算属性 watch 监听器
  • 数据结构-集合
  • 数据结构与算法-前缀和数组
  • TensorRT基础知识
  • Java 网络编程(一)—— UDP数据报套接字编程
  • Mit6.S081-实验环境搭建
  • AIGC: 关于ChatGPT中API接口调用相关准备工作
  • vue中shift+alt+f格式化防止格式掉其它内容
  • kubeadm 安装k8s1.28.x 底层走containerd 容器
  • Sprite Editor图片编辑器的使用_unity基础开发教程
  • Talk | UCSB博士生欧阳思琦: 利用词级别对比学习实现低资源下的语音翻译
  • [Geek Challenge 2023] web题解
  • [React]基于Antd的FormModal的组件封装以及useFormModal的hooks封装
  • 动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数
  • swiper和video实现抖音刷视频功能
  • P1005 [NOIP2007 提高组] 矩阵取数游戏
  • 内衣洗衣机哪个牌子好用?家用小型洗衣机推荐
  • 296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI
  • 定时器的使用及实现
  • MySQL - 并发控制与事务的隔离级别
  • 微服务实战系列之Redis
  • 安卓发布小技巧
  • 一键AI智能改写,一键AI智能生成原创文章
  • 网络安全(一)--网络环境构成,系统的安全
  • 外包干了3个月,技术倒退2年。。。
  • 修改错误的代码和改正错误的人生一样重要