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环境变量加载的研究相关推荐
- Linux环境变量说明与配置
相关的配置文件说明: /etc/profile 范围:对所有用户生效 作用: a.定义USER变量 b.定义LOGNAME变量 c.定义MAIL变量 d.定义PATH变量 e.定义HOSTNAME变量 ...
- 超详干货!Linux 环境变量配置全攻略
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习实验室 Linux环境变量配置 在自定义安装软件 ...
- Linux环境变量配置
这篇文章主要介绍了Linux环境变量配置全攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 在自定义安装软件的时候,经常需要 ...
- 中修改环境变量_超详干货!Linux环境变量配置全攻略
Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置M ...
- 操作系统:Linux 环境变量配置的 6 种方法!
Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置M ...
- Linux 环境变量配置总结
Linux是多用户的任务系统,对于每个用户都可以指定特定的用户变量.针对不同程序在不同的环境下运行就需要修改环境变量进行定制,本文介绍 Linux常见的环境变量设置方法,希望对你有帮助.图片 一.Li ...
- Linux 环境变量配置全攻略
Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置M ...
- Linux 环境变量配置全攻略,超详细~
感谢您抽出 . . 阅读本文 Linux是多用户的任务系统,对于每个用户都可以指定特定的用户变量.针对不同程序在不同的环境下运行就需要修改环境变量进行定制,本文介绍 Linux常见的环境变量设置方法, ...
- Linux 环境变量配置的 6 种方法,建议收藏!
Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 20.0 用户名:uusama 需要配置M ...
最新文章
- Android之LinearLayout布局下怎么让按钮固定在底部
- 【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )
- 13个AJAX验证框架
- Oracle入门(十四.16)之捕获用户定义的异常
- webpack 异步加载配置文件_详解webpack异步加载业务模块
- Golang教程:(十五)指针
- JVM实战总结:一个多线程中对象引用的问题
- c语言函数返回数组_C语言如何用一维数组拷贝函数,拷贝二位数组(C Primer Plus 10-7)...
- android studio for android learning (十二) 查看并获取联系人信息
- 非零矩阵A可以写成某个列满秩矩阵与某个行满秩矩阵的乘积
- 怎么制作真人qq秀_真人秀---搏击赛事新风向标的机与忧
- 计算机内部用机内码而不是国际码,在计算机内部用机内码而不用国标码表示汉字的原因是()。...
- Flask-SQLAlchemy relationship中的 lazy屬性
- CAD图如何导入Visio
- java合并word_java实现合并多个word文档 且可换页 实例代码(基于docx4j)
- visual C++ 编译器 下载
- MySQL备份恢复之mysqldump备份_SQL语句模式
- SDL(Simple DirectMedia Layer) 简介
- Echarts 思维导图(二)
- 当编程语言都变成女孩子 猿哥想想都觉得冲动
热门文章
- window.location.Reload()和window.location.href 区别
- 2011年的32有用的jQuery插件
- 唐骏:毕业5年决定你命运
- 现状,疑问,思考,探索,选择
- 文件服务器:共享文件夹的移动和权限设置备份2012-04-28
- webpack 编译html模板文件
- 小tips:JS严格模式(use strict)下不能使用arguments.callee的替代方案
- zipimport.ZipImportError: can't decompress data; zlib not available 解决办法
- Oracle 10g 之自动收集统计信息
- 三种字符编码:ASCII、Unicode和UTF-8