Linux环境变量加载的研究

简介:

我们经常遇到在linux执行某条命令时出现xxx文件没找到的问题。很多情况都不是库没有安装,而是环境变量的错误。

但是,我明明是设置了环境变量啊。所以,我对此进行了试验。

我们登录linux有很多种,bash来交互式执行,或者直接非交互式执行命令。在我的试验后,发现,原来这几个的环境变量加载都是不同的。

相关文件:

从电脑上,我找到这么几个相关文件。

1 /etc/profile
2 /etc/environment
3 /etc/bashrc
4 ~/.bash_profile
5 ~/.bashrc   
6 ~/.bash_logout

bash登录方式和环境变量的关系:

环境加载和4种bash模式相关。

什么是交互式shell(interactive shell)和非交互式shell(non-interactive shell):

交互式的shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。所以一般来说只要是需要用户交互的。

非交互式shell是 bash script.sh 这类的shell,脚本或程序执行完就结束了,没有交互。

登录式shell(login shell)和非登陆式shell(no-login shell):

需要输入用户名和密码的shell就是登陆式shell。因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。不输入密码的ssh是公钥打通的,某种意义上说也是输入密码的。

非登陆式的就是在登陆后启动bash等,即不是远程登陆到主机这种。

加载情况表:

文件 非交互+登陆式 交互+登陆式 交互+非登陆式 非交互+非登陆式
/etc/profile 加载 加载    
/etc/environment      
/etc/bashrc 加载 加载    
~/.bash_profile 加载 加载    
~/.bashrc 加载 加载 加载  
BASH_ENV       加载

相关场景:

  • 登陆机器后的第一个shell:login + interactive
  • 新启动一个shell进程,如运行bash:non-login + interactive
  • 执行脚本,如bash script.sh:non-login + non-interactive
  • 运行头部有如#!/usr/bin/env bash的可执行文件,如./executable:non-login + non-interactive
  • 通过ssh登陆到远程主机:login + interactive
  • 远程执行脚本,如ssh user@remote script.sh:non-login + non-interactive
  • 远程执行脚本,同时请求控制台,如ssh user@remote -t 'echo $PWD':non-login + interactive
  • 在图形化界面中打开terminal:
  • Linux上: non-login + interactive
  • Mac OS X上: login + interactive

准备:

我在每个文件的开头和结尾都加了一句脚本。

1 echo 脚本名 begin
2 xxxx脚本内容xxxx
3 echo 脚本名 end

实验:

下面显示输出的情况,用表格来隔开,以显示递归的情况。

直接ssh连上,登录:

交互式登录式shell

/etc/profile begin
/etc/profile end
~/.bash_profile begin
~/.bashrc begin
/etc/bashrc begin
/etc/bashrc end
~/.bashrc end
~/.bash_profile end

 在已经登陆后的终端,执行bash命令:

交互式登录式shell

/root/bashrc begin
/etc/bashrc begin
/etc/bashrc end
/root/bashrc end

在已经登陆后的终端,执行bash -l命令:

交互式登陆式shell

/etc/profile begin
/etc/profile end
/root/bash_profile begin
/root/bashrc begin
/etc/bashrc begin
/etc/bashrc end
/root/bashrc end
/root/bash_profile end

su命令到另一个用户:

交互式登录式shell

~/.bashrc begin
/etc/bashrc begin
/etc/bashrc end
~/.bashrc end

普通用户下sudo ls:

非交互式非登陆shell

没有输出变量信息。

bash -l -c “ls”命令:

非交互式登录式shell

/etc/profile begin
/etc/profile end
~/.bash_profile begin
~/.bashrc begin
/etc/bashrc begin
/etc/bashrc end
~/.bashrc end
~/.bash_profile end

远程 ssh sean@test ls 命令:

非交互式登陆式shell

~/.bashrc begin
/etc/bashrc begin
/etc/bashrc end
~/.bashrc end

一些结论:

其实从上面的显示中,我们可以看出,有几个文件有调用关系。

调用关系:

~/.bash_profile -> ~/.bashrc -> /etc/bashrc

其实去查看它们的代码就能发现,里面有执行的语句。

注意 bash -l :

加了-l参数后,打开的是登陆式shell。这要注意。

BASH_ENV变量:

一个环境变量,用于指定非交互+非登陆式的环境变量文件。

转载请注明:旅途@KryptosX » Linux环境变量加载的研究

目录
相关文章
|
Linux Shell
入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
199 6
|
8月前
|
Java Linux 应用服务中间件
在Rocky Linux 9上安装JDK并配置环境变量!
本教程介绍在Rocky Linux 9上安装JDK并配置环境变量的完整步骤。首先更新系统,清理旧版本JDK相关包及残留文件,确保环境干净。接着搜索并安装所需版本的JDK(如OpenJDK 17),验证安装是否成功。然后查找JDK安装路径,配置全局环境变量`JAVA_HOME`和`PATH`,最后验证环境变量设置。按照此流程操作,可顺利完成Java开发环境搭建,支持多版本切换(如JDK 8/11/17)。生产环境请谨慎操作,避免影响现有服务。
1396 21
|
8月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
10月前
|
Shell Linux
Linux-环境变量
通过合理设置和管理环境变量,可以显著提高工作效率和系统管理能力。理解并掌握这些基本操作,是每个Linux用户和管理员的必备技能。
318 13
|
10月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
567 15
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
613 4
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
322 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
610 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
安全 Linux 开发者
在Linux中,内核模块是什么以及如何加载和卸载它们?
在Linux中,内核模块是什么以及如何加载和卸载它们?
|
Java Linux
linux 对子用户配置java 环境变量
linux 对子用户配置java 环境变量
195 3