Linux:点命令source

相关阅读

Linuxicon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482


         source命令用于读取一个文件的内容并在当前Shell环境(包括交互式Shell或是非交互式Shell)执行里面的命令。它被称为点命令是因为命令名source也可以替换为一个点“.”。

        下面是该命令的语法。

用法
. filename [arguments]
source filename [arguments]
参数
filename 指定要读取并执行命令的文件名,一般是一个文本文件。
arguments 指定源文件执行时的位置参数。

        一般情况下,如果在交互式Shell中使用bash命令执行一个脚本,会创建一个Bash子进程。在某些情况下,这导致问题,比如在脚本中使用export命令导出一个变量时,它会成为该Bash子进程的环境变量,而对父进程Bash没有影响,这类似于在Bash中直接使用bash命令创建一个Bash子进程。

[***@EDA ~]$ bash            #在当前进程运行另一个bash子进程
[***@EDA ~]$ export aaa=1    #在子进程创建环境变量
[***@EDA ~]$ export        
*****
declare -x XDG_MENU_PREFIX="gnome-"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SESSION_DESKTOP="gnome-classic"
declare -x XDG_SESSION_ID="1"
declare -x XDG_SESSION_TYPE="x11"
declare -x XDG_VTNR="1"
declare -x XMODIFIERS="@im=ibus"
declare -x aaa="1"            #环境变量存在于子进程
[***@EDA ~]$ exit             #退出子进程
exit
[***@EDA ~]$ export        
*****
declare -x XDG_MENU_PREFIX="gnome-"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SESSION_DESKTOP="gnome-classic"
declare -x XDG_SESSION_ID="1"
declare -x XDG_SESSION_TYPE="x11"
declare -x XDG_VTNR="1"
declare -x XMODIFIERS="@im=ibus"
#环境变量不存在于父进程scripts文件
#!/bin/bash
export bbb=1[***@EDA ~]$ bash scripts
[***@EDA ~]$ export
*****
declare -x XDG_MENU_PREFIX="gnome-"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SESSION_DESKTOP="gnome-classic"
declare -x XDG_SESSION_ID="1"
declare -x XDG_SESSION_TYPE="x11"
declare -x XDG_VTNR="1"
declare -x XMODIFIERS="@im=ibus"
#环境变量不存在于父进程

        在上例中如果使用source命令执行该bash脚本,则会读取脚本内的内容(对上例而言是export bbb=1)并在当前Shell环境(对上例是交互式Shell)执行,就像是直接在交互式Shell中执行export bbb=1一样,因此可以成功导入环境变量,如下所示。

scripts文件
#!/bin/bash
export bbb=1[***@EDA ~]$ source ./scripts
[***@EDA ~]$ export
*****
declare -x XDG_MENU_PREFIX="gnome-"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SESSION_DESKTOP="gnome-classic"
declare -x XDG_SESSION_ID="1"
declare -x XDG_SESSION_TYPE="x11"
declare -x XDG_VTNR="1"
declare -x XMODIFIERS="@im=ibus"
declare -x bbb="1"                #环境变量成功创建

        source命令常用于立即将更改后的.bashrc配置文件应用于当前环境,而无需新建Bash。 

        Linux:设置别名命令alias一文中曾经提到,在非交互式的Bash脚本中,别名替换默认被关闭了,除非在脚本中使用shopt命令开启expand_aliases选项。如果此时使用source命令执行脚本,则别名替换可以正常进行,因为这相当于执行环境是交互式Shell。

scripts文件
#!/bin/bash#无需启用别名展开
#shopt -s expand_aliasesalias tt='echo 111' # 定义别名
tt # 使用别名[***@EDA ~]$ source ./scripts
111

        下面是一些source命令的规则。

        如果pathname不包含斜杠(/),Bash将首先在环境变量PATH列出的目录中查找该文件,这与很多其他命令不同,一般情况下一个不含/的文件名相当于使用相对路径,即./文件名。 

[***@EDA ~]$ source script   #直接使用文件名,注意此处文件名是scripts
bash: source: /usr/bin/script: cannot execute binary file  #在PATH中查找到了一个二进制文件,source命令执行失败

        如果使用shopt命令关闭sourcepath选项,则source不会搜索PATH。 

[***@EDA ~]$ shopt -u sourcepath
[***@EDA ~]$ source script   #直接使用文件名,注意此处文件名是scripts
bash: scripts: No such file or directory #在当前目录,无法找到文件scripts

        当Bash不处于POSIX模式时,如果在PATH中找不到文件,则还会在当前目录中搜索(此时相当于./文件名)。 

[***@EDA ~]$ set -o | grep posix #查看是否处在posix模式
posix          	off 
[***@EDA ~]$ source scripts   #直接使用文件名,最后在当前目录查找到了scripts脚本

        文件不必须是可执行的文件,它可以是一个简单的文本文件,而不具有可执行的属性。 

         如果提供了任何arguments,它们将作为位置参数($0, $1...)传递该文件内的命令,需要注意的是,这里有一点特殊,传递给source的位置参数不会改变当前Shell环境的位置参数,这就像是这些位置参数在执行文件内部的命令时生效(这是对当前环境位置参数的保护)。另外需要说明的是,如果不传递参数,source执行的文件依然可以访问到当前环境的位置参数。

script文件
echo $1
echo $2[***@EDA ~]$ source ./script Hello World #传递参数
Hello   #可以访问$1(这是source传递的)
World   #可以访问$2(这是source传递的)
[***@EDA ~]$ echo $1 $2
(nothing output)  #source传递的位置参数不会影响当前进程
[***@EDA ~]$ set -- Hello World #设置位置参数
[***@EDA ~]$ source ./script #不传递参数
Hello   #可以访问$1(这是当前环境的)
World   #可以访问$2(这是当前环境的)
[***@EDA ~]$ echo $1 $2
Hello World

        source命令的返回值是脚本中最后一个退出的命令的状态(如果没有执行任何命令,则直接返回 0),如果找不到或无法读取文件,则返回false。 

[***@EDA ~]$ source ss
bash: source: /usr/sbin/ss: cannot execute binary file
[***@EDA ~]$ echo $?
126
[***@EDA ~]$ source ./script
Hello
World
[***@EDA ~]$ echo $?
0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/285414.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS7/iis8/iis10安装II6兼容模块 以windows2022为例

因安全狗的提示 安全狗防护引|擎安装失败 可能原因是: IIS7及以上版本末安装1IS6兼容模块! .所以操作解决 如下. 在开始菜单中,找到服务器管理器.找到下图的IIS,右键添加角色和功能,找到web服务器的管理工具选项,iis6管理兼容性 打钩并安装. 如下图

自然拼读-组合音(上篇)

自然拼读-组合音 1、元音字母A的二声发音组合 组合音at 注意:“t”是气音,不要太重。 Eg:cat(猫) fat(肥的) bat(蝙蝠) 组合音ap 注意:“p”在尾巴发音…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里,有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说,了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会(MRC)。 1. 了解…

蓝桥杯基础练习详细讲解二(具体代码、解题思路、Python)

试题 基础练习 回文数 提交此题 评测记录 资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的&#x…

mysql基础3索引

存储引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是 基于库的,所以存储引擎也可被称为表类型。 1). 建表时指定存储引擎 CREATE TABLE 表名(字段1 字段1类型 [ COMMENT 字段1注释 ] ,......字段n…

Docker进阶:Docker-compose 实现服务弹性伸缩

Docker进阶:Docker-compose 实现服务弹性伸缩 一、Docker Compose基础概念1.1 Docker Compose简介1.2 Docker Compose文件结构 二、弹性伸缩的原理和实现步骤2.1 弹性伸缩原理2.2 实现步骤 三、技术实践案例3.1 场景描述3.2 配置Docker Compose文件3.3 使用 docker-…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题,ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

AIGC实战——Transformer模型

AIGC实战——Transformer模型 0. 前言1. T52. GPT-3 和 GPT-43. ChatGPT小结系列链接 0. 前言 我们在 GPT (Generative Pre-trained Transformer) 一节所构建的 GPT 模型是一个解码器 Transformer,它逐字符地生成文本字符串,并使用因果掩码只关注输入字…

海外媒体宣发:十大国外中文网站-大舍传媒

十大国外中文网站 1、欧洲时报 覆盖欧洲且较具影响力的华文媒体 国外中文新闻网站,欧洲时报文化传媒集团旗舰日报《欧洲时报》旗下官方网站,总部设在法国巴黎,创刊于1983年,现已成为唯一发行覆盖全欧、发行量最大、最具影响力的华…

Vue3 上手笔记

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

STM32最小核心板使用HAL库ADC读取MCU温度(使用DMA通道)

STM32自带CPU的温度数据,需要使用ADC去读取。因此在MX创建项目时如图配置: 模块初始化代码如下: void MX_ADC1_Init(void) {/* USER CODE BEGIN ADC1_Init 0 *//* USER CODE END ADC1_Init 0 */ADC_ChannelConfTypeDef sConfig {0};/* USER…

Docker 入门使用说明

Docker 入门使用说明 Docker 安装 Docker 官网:Docker Docker 安装说明:Docker 安装说明 这里由于 Docker 在实时更新,所以每次安装 Docker 用来导入 key 的链接可能会有变化,这里就参考官方的安装方法即可 Docker 常用命令说…

(ES6)前端八股文修炼Day2

1. let const var 的区别 var: var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域,而不是块作用域,这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明,而且变量的值可以在声明前使用,这可能…

生成微信小程序二维码

首页 -> 统计 可以通过上面二个地方配置,生成小程序的二维码,并且在推广分析里,有详细的分析数据,

Vue3更新Package.json版本号

由于我之前已经更新过了,下面的方法提示我已经是最新的了,记录一下,过段时间在测试一下 npm install -g vue/clivue upgrade

【Hadoop大数据技术】——Hadoop高可用集群(学习笔记)

📖 前言:Hadoop设计之初,在架构设计和应用性能方面存在很多不如人意的地方,如HDFS和YARN集群的主节点只能有一个,如果主节点宕机无法使用,那么将导致HDFS或YARN集群无法使用,针对上述问题&#…

项目1-加法计算器

1.创建项目 2.导入前端代码 2.1 static包内 2.2 测试前端代码是否有误 显示成功说明无误 2.3 定义用户接口 请求路径:calc/sum 请求方式:GET/POST 接口描述:计算两个整数相加 请求参数: 参数名类型是否必须备注num1Integer是参与计算的第…

YiYi-Web项目介绍

YiYi-Web项目介绍 1. 简介2. 使用2.1 后端开发环境2.2 前端开发环境 3. 测试环境:4. 更新日志5. 打包情况6.项目截图 本项目前端是html、css、js、jQuery基础技术。 后端都是最新的SpringBoot技术,不分离版本, 是最基础的项目开发教程&#x…

【C语言】linux内核pci_alloc_irq_vectors

一、注释 代码中包含了几个关于PCI(外围组件互联)设备中断请求(IRQ)向量分配的函数,以及内联函数声明,下面是对这些函数的中文注释: static inline int pci_alloc_irq_vectors_affinity(struc…

Java安全 反序列化(3) CC1链-TransformedMap版

Java安全 反序列化(3) CC1链-TransformedMap版 本文尝试从CC1的挖掘思路出发,理解CC1的实现原理 文章目录 Java安全 反序列化(3) CC1链-TransformedMap版配置jdk版本和源代码配置前记 为什么可以利用一.CC链中的命令执行我们可以尝试一下通过InvokerTransformer.tr…