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

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 inexec)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.lryc.cn/news/250310.html

相关文章:

  • IDEA编译器技巧-提示词忽略大小写
  • 【MySQL】MySQL安装 环境初始化
  • C# IList 与List区别二叉树的层序遍历
  • 助力android面试2024【面试题合集】
  • 【动态规划】LeetCode-62.不同路径
  • 对 Vision Transformers 及其基于 CNN-Transformer 的变体的综述
  • MongoDB简介
  • 尚硅谷hadoop3.x课程部分资料文件下载,jdk,hadoopjar包
  • vue el-radio-group多选封装及使用
  • Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19
  • TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印
  • [UGUI]实现从一个道具栏拖拽一个UI道具到另一个道具栏
  • 微服务--08--Seata XA模式 AT模式
  • Doris 数据导入一:Broker Load 方式
  • docker踩坑记录:docker容器创建doris容器间无法通讯问题
  • springboot+java校园自助洗衣机预约系统的分析与设计ssm+jsp
  • TCP简介及特性
  • ElasticSearch 排障常用方法
  • 【SA8295P 源码分析 (四)】136 - QNX 如何抓取系统 log 方法 之 网络部分日志抓取方法
  • 传统算法:使用Pygame实现SVM(支持向量机)算法
  • cookie wzws_sess** 逆向
  • JIRA 基本使用
  • 什么是JVM的内存模型?详细阐述Java中局部变量、常量、类名等信息在JVM中的存储位置
  • c#学习相关系列之as和is的相关用法
  • excel合并单元格教程
  • img[src=““] img无路径情况下,页面出现边框
  • TA-Lib学习研究笔记(八)——Momentum Indicators 上
  • 【MATLAB源码-第91期】基于matlab的4QAM和4FSK在瑞利(rayleigh)信道下误码率对比仿真。
  • pywin32后台键鼠
  • 大屏适配方案(vw、vh)