source 与 shell 之详解(Detailed Explanation of Source and Shell)

devtools/2025/2/8 6:55:22/

 source 命令与 shell 变量

随着IC工具的升级迭代,不同项目使用到的 IC 工具版本可能会不一样。为保证 IC 工具版本和芯片项目的对应,需要使用 source 命令执行对应项目的环境变量设置脚本。那么,source 命令与一般的脚本执行命令,有什么区别呢?

下面以 bash 环境为例进行详细说明。

1. shell 与局部变量、环境变量

用户登录到 Linux 系统后,可以以终端交互的方式打开一个用户 shell,暂且称之为父shell。在这个shell 中,用户可以使用 shell命令,声明变量,或者运行shell 脚本。

当用户运行 shell 脚本时,系统将创建一个子 shell。子 shell 运行完毕,将返回到之前父shell。一个父shell,可以派生出很多的子 shell。

在父 shell或子 shell 定义的变量只能在当前 shell 中引用。这些变量称之为局部变量。

例如,在一个shell 窗口中运行以下命令:

c="ccc" ; echo $c

显示:

ccc

创建一个脚本c.sh, 内容如下:

#!/bin/bashecho $c

在当前 shell 中运行此脚本 c.sh,将不会有任何显示:如果父shell 的变量需要被其他子 shell 进行引用、修改,需要使用 export 命令对其进行变量输出。此类变量称为环境变量。环境变量是全局性的。

例如,在shell 窗口中运行以下命令:

export c="ccc" ; echo $c

同样创建脚本c.sh, 内容如下:​​​​​​​

#!/bin/bashecho $c

在当前 shell 中运行此脚本 c.sh,

./c.sh

便会显示变量 c 的值:

ccc

如果 shell 脚本中的变量需要被其他父或子shell 进行引用,除了需要使用 export 命令,还需要使用 source 命令运行脚本文件。这是什么原理呢?

2. source 命令

source命令用于执行shell 类型的脚本文件。

source命令也被称为“点命令”,在bash 中 等同于 "." 命令。例如执行一个脚本文件 test.sh , 以下两行命令是等效的。​​​​​​​

. test.shsource test.sh

对于一个可执行脚本 test.sh,使用 ./test.sh、sh test.sh和 source test.sh 的区别如下:

  • (1) 当 test.sh 脚本具有可执行权限时,./test.sh、sh test.sh 是没有区别的。两者都会创建一个子shell 执行对应的脚本命令。

  • (2) 当 test.sh 没有执行权限时,只能使用 sh test.sh。执行 ./test.sh 命令会报错。

  • (3) source test.sh 只是简单地读取脚本中的命令,并在当前 shell 里执行,并不会创建新的子shell。

    总结就是,使用 source 执行脚本文件时,只会在当前shell执行,不会创建新的子 shell,脚本文件中 export 命令对应的变量会输出为全局的环境变量。所以,source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销、重新登录。

例如,shell中创建环境变量 P1,其中冒号“:”表示追加 :

export P1=/test/dir1:/test/dir2”

创建脚本 test.sh:​​​​​​​

#!/bin/bashecho $P1export P1=$PATH:/test/h3:/test/h4echo $P1

shell 窗口中运行脚本  ./test.sh,结果如下:​​​​​​​

/test/dir1:/test/dir2/test/dir1:/test/dir2:/test/h3:/test/h4

shell 窗口中运行命令 echo $P1,结果如下:​​​​​​​

echo $P1/test/dir1:/test/dir2

这是因为子shell 中的变量 P1 并不能被父shell 继承。

shell 窗口中使用 source 命令运行脚本  ./test.sh,显示一样的结果

source test.sh/test/dir1:/test/dir2/test/dir1:/test/dir2:/test/h3:/test/h4

shell 窗口中再次运行命令 echo $P1,此时结果如下:​​​​​​​

echo $P1/test/dir1:/test/dir2:/test/h3:/test/h4

因为使用 source 命令后,脚本内容在当前shell 中执行,P1 被 export 输出为环境变量,父shell 中可以对 P1 环境变量进行引用。

3. 其他相关命令

(1) C shell 中设置环境变量的方法

setenv P1 "$P1 /test/h3 /test/h4"
(2) 清除环境变量 P1的命令为:
unset P1

(3) 显示所有环境变量

env

http://www.ppmy.cn/devtools/157034.html

相关文章

unity学习32:角色相关1,基础移动控制

目录 0 应用商店 1 角色上新增CharacterController 组件 1.1 角色上新增CharacterController 组件 1.2 如果没有这个则会报错​编辑 2 速度 2.1 默认速度 2.2 修改速度为按时间计算 2.2 movespeed, 3 测试移动的代码 3.1 CharacterController 变量的声明…

python:递归函数与lambda函数

递归函数:1.函数内调用自己 2.有一个出口 1.递归 一.有出口时 def sum(num):if num1:return 1return numsum(num-1) asum(3) print(a) #num3 3sum(2) #num2 2sum(1) #num1是返回1 #即3sum(2)即32sum(1)即321运行结果 6 二.无出口时 def sum(num)…

探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变

在人工智能快速发展的当下,大型语言模型(LLMs)已成为众多应用的核心技术。检索增强生成(RAG)(RAG 系统从 POC 到生产应用:全面解析与实践指南)和缓存增强生成(CAG&#x…

M5AXXB 100v三端稳压ic ldo降压芯片工作原理及应用实例分析

M5AXXB 100v三端稳压ic ldo降压芯片工作原理及应用实例分析 ### M5AXXB 芯片工作原理及应用实例分析 #### 一、引言 M5AXXB 是一款高性能线性调压芯片,广泛应用于各种电源调节领域。本文将详细介绍其工作原理,并通过实际应用场景分析其在现代电子设备中…

录音质检,只质检录音,没有显卡的服务器配置分析

如果不做实时质检,只做录音质检,且需要支持 500并发,可以通过以下优化策略和资源配置来实现高效处理: 核心优化思路 批量处理: 将录音文件分批次处理,避免单次并发过高导致资源耗尽。使用任务队列&#xf…

达梦分布式集群DPC_表分区方式详细介绍_yxy

达梦分布式集群DPC_表分区方式详细介绍 1 范围分区1.1 建表语句示例1.2 优劣势分析 2 间隔分区2.1 建表语句示例2.2 优劣势 3 HASH分区3.1 建表示例3.2 优劣势分析 4 列表分区4.1 建表示例4.2 优劣势分析 5 以上分区组成的复合分区5.1 建表示例5.2 优劣势分析 6 分区方式适合场…

工作总结:上线篇

文章目录 前言一、上线流程二、各种问题流水线问题1.编译问题2.单测问题3.磁盘空间问题 发单问题上线后的问题前后端合作的情况后端项目和后端项目合作的情况后端项目和小程序合作的情况自己的项目代码的情况(无任何合作)发单问题 前言 上线算是我工作中…

部署DeepSeek-R1-Distill-Qwen-7B并进行推理

下载模型文件: 将https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B/tree/main目录下面的所有文件全部下载下来,稍微有点大,所有文件将近16个G 编写代码进行推理 $ more testDS.py from transformers import AutoModelForC…