Linux:bash在被调用时会读取哪些启动文件?
(本文基于5.1-6ubuntu1.1
版本的bash
)
bash
在被调用时会读取哪些启动文件?要回答这个问题,首先要弄清楚两个概念:login shell和interactive shell。
login shell
login shell是指这样的shell:
- 第一个命令行参数(进程名)以
-
开头,也就是满足argv[0][0] == '-'
- 或者 设置了
--login
/-l
选项
对于条件1,有一个例子:当执行su - [USER_NAME]
时,su
命令会启动一个login shell,argv[0][0]
会被设置为-
。su
手册中写到:
-, -l, --loginStart the shell as a login shell with an environment similar to a real login:• clears all the environment variables except TERM and variables specified by --whitelist-environment• initializes the environment variables HOME, SHELL, USER, LOGNAME, and PATH• changes to the target user’s home directory• sets argv[0] of the shell to '-' in order to make the shell a login shell
不满足login shell条件的即为non-login shell。
interactive shell
interactive shell是指这样的shell:
- 满足以下条件
- 没有非选项参数(如果设置了
-s
选项则可以有非选项参数(non-option arguments)) - 并且 没有设置
-c
选项 - 并且 标准输入和标准错误都被连接到终端
- 没有非选项参数(如果设置了
- 或者 设置了
-i
选项
对于一个interactive shell,PS1
环境变量会被设置,同时$-
中会含有i
选项:
$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
$ echo $-
himBHs
interactive shell,顾名思义,指可交互的shell。所以像是创建子进程执行一个脚本(bash ./foo.sh
)或是执行一条命令(bash -c 'ls'
)时,创建出来的bash
进程就显然不是可交互的,因此不属于interactive shell。除此之外,bash
还把重定向了标准输入或者标准错误的bash
排除在了interactive shell之外。所以对于bash 2>/dev/null
这种情况,尽管实际上是可交互的,但仍然不属于interactive shell。下面这些命令创建的bash
进程都不属于interactive shell:
$ bash ./foo.sh
$ bash -c 'ls'
$ bash < foo.sh
$ bash 2>/dev/null
然而,bash
提供了一个选项-i
,可以强行将一个bash
设置为interactive shell,上面提供的4个例子中,只要加上了-i
选项,它们就全部变成了interactive shell。
所以说,判断一个bash
是否为interactive shell,不能从表现上看,还是要看它在被调用时设置了哪些参数。
在代码层面上,interactive shell的判断逻辑如下:
/* First, let the outside world know about our interactive status.A shell is interactive if the `-i' flag was given, or if all ofthe following conditions are met:no -c commandno arguments remaining or the -s flag givenstandard input is a terminalstandard error is a terminalRefer to Posix.2, the description of the `sh' utility. */if (forced_interactive || /* -i flag */(!command_execution_string && /* No -c command and ... */wordexp_only == 0 && /* No --wordexp and ... */((arg_index == argc) || /* no remaining args or... */read_from_stdin) && /* -s flag with args, and */isatty (fileno (stdin)) && /* Input is a terminal and */isatty (fileno (stderr)))) /* error output is a terminal. */init_interactive ();elseinit_noninteractive ();
不满足interactive shell条件的即为non-interactive shell。
不同情况下读取的启动文件
在了解了login shell和interactive shell的概念后,我们就可以看看在不同情况下bash
会读取哪些启动文件了。
- login && (interactive || non-interactive) shell
- 读取
/etc/profile
- 读取
~/.bash_profile
、~/.bash_login
、~/.profile
中存在且可读的第一个
- 读取
- non-login && interactive shell
- 读取
/etc/bash.bashrc
- 读取
~/.bashrc
- 读取
- non-login && non-interactive shell
- 读取
BASH_ENV
环境变量中保存的文件路径,如果存在的话
- 读取
需要注意的是,尽管login shell不会直接读取/etc/bash.bashrc
或是~/.bashrc
,但是通常会在满足条件时,通过/etc/profile
和~/.bash_profile
/~/.bash_login
/~/.profile
间接读取这两个文件:
# /etc/profileif [ "${PS1-}" ]; thenif [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then# The file bash.bashrc already sets the default PS1.# PS1='\h:\w\$ 'if [ -f /etc/bash.bashrc ]; then. /etc/bash.bashrcfielseif [ "$(id -u)" -eq 0 ]; thenPS1='# 'elsePS1='$ 'fifi
fi
# ~/.profileif [ -n "$BASH_VERSION" ]; then# include .bashrc if it existsif [ -f "$HOME/.bashrc" ]; then. "$HOME/.bashrc"fi
fi
特殊情况下读取的启动文件
以sh
的名字调用时
在这种情况下,bash
会模仿sh
的行为:
- login && (interactive || non-interactive) shell
- 读取
/etc/profile
- 读取
~/.profile
- 读取
- non-login && interactive shell
- 读取
ENV
环境变量中保存的文件路径
- 读取
- non-login && non-interactive shell
- 不读取启动文件
以posix
模式调用时
如果bash
调用时设置了--posix
参数,那么在interactive shell的情况下,bash
会尝试从ENV
环境变量中获取启动文件路径,不会读取其他启动文件。
被ssh
调用时
在被ssh
调用时,或者标准输入是一个网络连接时,会触发一些特殊逻辑:在这种情况下,即使是non-login && non-interactive shell情况的组合,bash
仍然会读取/etc/bash.bashrc
和~/.bashrc
。
/* get the rshd/sshd case out of the way first. */if (interactive_shell == 0 && no_rc == 0 && login_shell == 0 &&act_like_sh == 0 && command_execution_string){run_by_ssh = (find_variable ("SSH_CLIENT") != (SHELL_VAR *)0) ||(find_variable ("SSH2_CLIENT") != (SHELL_VAR *)0);/* If we were run by sshd or we think we were run by rshd, execute~/.bashrc if we are a top-level shell. */if ((run_by_ssh || isnetconn (fileno (stdin))) && shell_level < 2){maybe_execute_file (SYS_BASHRC, 1);maybe_execute_file (bashrc_file, 1);return;}}
相关文章:
Linux:bash在被调用时会读取哪些启动文件?
(本文基于5.1-6ubuntu1.1版本的bash) bash在被调用时会读取哪些启动文件?要回答这个问题,首先要弄清楚两个概念:login shell和interactive shell。 login shell login shell是指这样的shell: 第一个命令行参数(进程…...
帆软FineReport之替换函数
在日常帆软FineReport中经常会使用字符串替换函数,记录下来,方便备查。 一、字符串替换 第一种、指定文本替换 使用SUBSTITUTE函数,语法如下所示 SUBSTITUTE(text,old_text,new_text,instance_num) 字段…...

Redis的应用场景及类型
目录 一、Redis的应用场景 1、限流 2、分布式锁 3、点赞 4、消息队列 二、Redis类型的命令及用法 1、String类型 2、Hash类型 3、List类型 4、Set类型 5、Zset类型 6、Redis工具类 Redis使用缓存的目的就是提升读写性能 实际业务场景下,我们就可以把 Mys…...
【图像处理】不智能的目标识别
目录 目标识别的划分 识别入门 概念学习 滤波 模版 阈值化 形态学操作 开运算 闭运算 编程语言 示例 大家有没有想过在没有人工智能或者说没有机器学习的的时候,计算机是怎么做目标识别的? 计算机视觉时至今日也是急需人才的领域&…...

《500 Lines or Less》(5)异步爬虫
https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html ——A. Jesse Jiryu Davis and Guido van Rossum 介绍 网络程序消耗的不是计算资源,而是打开许多缓慢的连接,解决此问题的现代方法是异步IO。 本章介绍一个简单的网络爬虫&a…...
Transformer!自注意力机制的高层级理解Attention Is All You Need!
背景 最近在不断深入学习LLM的相关内容,那么transformer就是一个绕不开的话题。然而对于一个NLP门外汉来说,论文看得是真头疼,总览全网,我们似乎缺少一个至高而下的高层级理解。所以本文就来弥补此方面的缺失~ 本文并不讲解有关…...

关于使用Postman在请求https网址没有响应,但是用浏览器有响应的问题解决
一、问题描述 使用postman调用正式环境的公共接口,无需鉴权,但是产生了返回状态码200,但是data中却无数据,如下 {"code": "200","message": "操作成功","data": {"qr_c…...

【React 】开发环境搭建详细指南
文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中,React 是一个非常流行的框架,用…...

结构体笔记
结构体 C语言中的数据类型: 基本数据类型:char/int/short/double/float/long 构造数据类型:数组,指针,结构体,共用体,枚举 概念: 结构体是用户自定义的一种数据类型,…...
Elasticsearch:Golang ECS 日志记录 - zerolog
ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。在本教程中,我将详述如何 编码器以 JSON 格式记录日志,并以 ECS 错误格式处理错误字段的记录。 默认情况下,会添加以下字段&…...

Ip2region - 基于xdb离线库的Java IP查询工具提供给脚本调用
文章目录 Pre效果实现git clone编译测试程序将ip2region.xdb放到指定目录使用改进最终效果 Pre OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架 Ip2region - xdb java 查询客户端实现 效果 最终效果 实现 git clone git clone https://github.com/lionsou…...

研发管理革命:探索顶尖的工时系统选择
国内外主流的10款研发工时管理系统对比:PingCode、Worktile、无鱼项目工时系统、Toggl Track、泽众ALM、Asana、Jira、GitHub、Trello、TrackingTime。 在研发团队中,工时管理常常成为效率瓶颈,尤其是在资源分配和项目进度跟踪方面。选择合适…...

微服务-MybatisPlus下
微服务-MybatisPlus下 文章目录 微服务-MybatisPlus下1 MybatisPlus扩展功能1.1 代码生成1.2 静态工具1.3 逻辑删除1.4 枚举处理器1.5 JSON处理器**1.5.1.定义实体****1.5.2.使用类型处理器** **1.6 配置加密(选学)**1.6.1.生成秘钥**1.6.2.修改配置****…...

【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】
def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键,保持顺序ordered_keys []# 遍历data中的每个字典,添加其键到ordered_keys,如果该键还未被添加for d in original_list:for …...

IDEA的pom.xml显示ignored 的解决办法
问题: idea中创建Maven module时,pom.xml出现ignored。 原因: 相同名称的module在之前被创建删除过,IDEA会误以为新的同名文件是之前删除掉的,将这个新的module的pom.xml文件忽略掉显示ignored. 解决: 在…...

2. 卷积神经网络无法绕开的神——LeNet
卷积神经网络无法绕开的大神——LeNet 1. 基本架构2. LeNet 53. LeNet 5 代码 1. 基本架构 特征抽取模块可学习的分类器模块 2. LeNet 5 LeNet 5: 5 表示的是5个核心层,2个卷积层,3个全连接层.核心权重层:卷积层、全连接层、循环层ÿ…...

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
审核看清楚了 ! 这是以太坊测试网络!用于学习的测试网络!!! 有关web3 和区块链的内容为什么要给我审核不通过? 别人凭什么可以发! 目标成果: 实现功能分析: 显示账户信…...
关于珞石机器人二次开发SDK的posture函数的算法RX RY RZ纠正 C#
在珞石SDK二次开发的函数钟,获取当前机器人位姿的函数posture函数在输出时会发现数据不正确,与示教器数据不一致。 其中第一个数据正确 第二三各数据为相反 第四五六各数据为弧度制 转换方法为(弧度/PI)*180度 然后发现第四个数据还要加上180度 第五…...

【Three.js基础学习】17.imported-models
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 课程回顾: 如何在three.js 中引入不同的模型? 1. 格式 (不同的格式) https://en.wikipedia.org/wiki/List_of_file_form…...

Spring Bean - xml 配置文件创建对象
类型: 1、值类型 2、null (标签) 3、特殊符号 (< -> < ) 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...