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

news/2025/2/8 14:17:01/

 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/news/1570337.html

相关文章

每日Attention学习21——Cascade Multi-Receptive Fields

模块出处 [MICCAI 24] [link] TinyU-Net: Lighter Yet Better U-Net with Cascaded Multi-receptive Fields 模块名称 Cascade Multi-Receptive Fields (CMRF) 模块作用 轻量感受野块 模块结构 模块特点 起点使用PWConv(PointWise Convolution, 11卷积)压缩通道&#xff0c…

【C语言】数组名及其地址的理解与应用

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯数组名的本质1. 数组名实际上是一个指向第一个元素的指针2. 数组名与数组首元素地址的关系 💯数组名与指针算术操作1. 数组名的指针特性2. 数组名与数组整体…

四、GPIO中断实现按键功能

4.1 GPIO简介 输入输出(I/O)是一个非常重要的概念。I/O泛指所有类型的输入输出端口,包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO(General-Purpose Input/Output)则是一个常见的术语&#xff0c…

GlusterFS源码讲解:如何实现最终一致性

引言 在分布式文件系统中,由于网络延迟、节点故障或临时分区原因,很难保证写操作在所有节点上立即生效。为了解决这一问题,很多系统采用最终一致性模型:写操作可能一开始没有同步到所有节点,但经过一段时间后&#xff…

mobaxterm 无法ssh连接ubuntu

0.查看IP地址 BASH homename -I ip addr show 1. 确保安装了 openssh-server 首先,确保你已经安装了 openssh-server,这是提供 SSH 服务的关键包。 步骤: 打开终端并更新包列表: BASH sudo apt update 安装 openssh-serve…

FocusAny v0.6.0 MacOS和Linux安装优化,独立窗口显示优化

FocusAny 是一个专注高效的AI工具条,可以使用 Alt / Option空格 一键唤起,通过插件快速安装,可以扩展出非常多的功能。 安装使用 访问 https://focusany.com 下载 对应系统 安装包,一键安装即可。 目前支持 Windows、MacOS、Linu…

windows电脑-ubuntu,传输文件

FileZilla是一款免费的工具,是基于 FTP 协议进行文件互传的,在传输过程中我们的ubuntu是作为服务器, FileZilla 工具则是作为客户端。 1.ubuntu安装 FTP服务:sudo apt-get install vsftpd 2.检查 /etc/vsftpd.conf 配置文件&…

Maven 构建命令详解

1. Maven 构建命令概述 Maven 是 Java 生态中最流行的构建工具之一,它提供了一套标准化的构建命令,使得开发者可以轻松管理项目的编译、测试、打包、安装和部署等任务。 本篇文章将深入解析 Maven 中最常用的构建命令,包括: mv…