Linux环境变量来自哪些文件?
Linux环境
在LinuxShell登陆成功之后,Linux会从文件中获取一系列的数据为该次登陆所用,这种数据会在个别指令或个别程序中被使用到。那些数据就称为LinuxShell运行时的环境。环境中的数据可以大致分为四种:环境变量,Shell变量,别称(alias),Shell函数。其中Shell变量,别称,Shell函数在此不做详尽说明。
环境变量里有哪些?
可以直接用无参数的printenv命令来输出当前session的环境变量以及环境变量的值。若加上参数,则是输出某个变量的值。倘若更便捷地查看,可以将printenv的输出传给less来查看环境变量(1):
printenv | less
下边是在我的Linux系统上的部份输出结果:
... ... MANDATORY_PATH=/usr/share/gconf/cinnamon.mandatory.path XDG_SESSION_ID=c2 XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/rit USER=rit DESKTOP_SESSION=cinnamon QT4_IM_MODULE=fcitx GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/e9e1def3_9380_43b6_8ce3_7916861e45d2 DEFAULTS_PATH=/usr/share/gconf/cinnamon.default.path QT_QPA_PLATFORMTHEME=qt5ct PWD=/home/rit HOME=/home/rit ... ...
可以看见,平常常接触到的PWD,HOME,USER等都在其中。
假如要在命令的参数中使用某个变量的值,可以输入"$变量名"(2)。诸如:
ls $HOME/bin
用户自定义变量
不仅系统自带的变量,用户还可以自定义变量:
rit@rit-X405UA:~$ foo=FOO rit@rit-X405UA:~$ hello='Hello World' rit@rit-X405UA:~$ echo $foo FOO rit@rit-X405UA:~$ echo $hello Hello World
注意到等号左右两侧不留空格,由于空格在shell命令上面被视为分隔符,并不是无意义的符号。
注意到假如出现特殊字符红帽linux系统下载,如空格,$,等等,要用冒号扩上去(3)。
假如要让接出来在该shell运行的程序才能访问到该变量,则要使用export命令:
rit@rit-X405UA:~$ export foo hello
像这样在当前的session中定义的变量只在当前session有效,即退出再登陆这个变量就不存在了。若要在每次登入到shell的时侯都能使用到该变量,需将该变量定义到环境变量的配置文件中。
环境变量来自什么文件?
如文章开头所述,Linux会从文件中获取环境变量。这么是什么文件在为LinuxShell提供环境变量呢?(前面再解释loginshell与non-loginshell)
对于loginshell:
/etc/profile,这个文件是loginshell的全局环境变量配置文件,全局意味着对所有用户都有效~/.bash_profile,~/.bash_login,~/.profile,这三个文件用于配置用户个人的环境变量,所以每位用户的HOME目录下就会有起码这三个文件中的一个(取决于linux的发行版本)linux修改用户环境变量,读取时只会读取其中一个。loginshell登陆时linux会先读取/etc/profile这个全局配置文件linux内存管理,再在HOME目录根据一定次序找寻这三个文件,最后会读取找到的第一个文件。若与/etc/profile中定义的变量有冲突,会将该变量覆盖。
对于non-loginshell:
/etc/bash.bashrc,这个文件是non-loginshell的全局环境变量配置文件。(网上一些博客的介绍中,这个文件不是/etc/bash.bashrc而是/etc/bashrc,其实这取决于发行版本)~/.bashrc,这个文件是用户个人的non-loginshell环境变量配置文件,与loginshell相同,该文件在/etc/bash.bashrc后执行,有冲突时,该文件也会将冲突的变量重画。
以上关于文件读取次序的描述参考于这篇文章。
各类linux发行版都带有一个命令su,若直接"su用户名",则会以non-loginshell登陆到该用户,若加上选项"-"或是"-l"或是"--login",则会以loginshell登陆到该用户。诸位读者倘若更清楚的体会这种文件的读取过程,可以借助这个命令,通过更改那些文件来进行测试。
loginshell与non-loginshell
登陆LinuxShell有两种方式:loginshell与non-loginshell。loginshell一般会作为第一个登陆的shell(例如开机时的登陆),而non-loginshell一般是开机后从GUI直接启动的shell。通过这两种方式登陆的环境变量会有一些区别。
1.non-loginshell会承继上一个进程(一般是loginshell)中的一些环境变量
可以通过一个简单测试来验证。
首先,在当前shell中自定一个变量foo=FOO,并export(为了让子进程也能使用这个变量,而shell本身就是一个程序):
rit@rit-X405UA:~$ foo=FOO rit@rit-X405UA:~$ export foo
接着,以loginshell登陆到另一个帐户bob,并尝试查看foo变量:
rit@rit-X405UA:~$ su - bob Password: bob@rit-X405UA:~$ echo $foo bob@rit-X405UA:~$
结果foo变量为空,在这儿说明foo未被定义。
接着,以non-loginshell登陆到另一个帐户bob,并查看foo变量:
rit@rit-X405UA:~$ su bob Password: bob@rit-X405UA:/home/rit$ echo $foo FOO
结果foo变量与rit这个用户的shell中的定义一致。
说明non-loginshell承继了上一个进程的用户自定变量,而loginshell没有承继。
2.PWD,HOME,USER,PATH
在1中的事例就可以注意到,loginshell的PWD弄成了当前用户的HOME目录(~),而non-loginshell则承继了父进程的工作目录。
若使用echo来查看HOME与USER,我们会发觉两种登陆形式登陆以后这两个变量都切换到了当前用户对应的home目录与username。
对于两种登陆形式的PATH的区别,可以在~/.bash_profile(或是~/.bash_login,~/.profile)中找到部份线索。上面说过,这三个文件是在loginshell中读取的,假如我们仔细比对它们与~/.bashrc,都会发觉~/.bash_profie中多了如此两行:
... PATH="$HOME/bin:$PATH" ... PATH="$HOME/.local/bin:$PATH" ...
所以在用两种方法登陆以后,用echo查看PATH变量可以看见区别如下:
non-loginshell:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
loginshell:
/home/rit/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
上面不包含$HOME/bin是由于home目录没有这个文件夹。
仔细观察可以发觉还有别的区别,但这些区别的出处就不太好找了。
注释
(1)linuxshell提供一种叫pipeline的特点,意味着可以将一个命令的输出重定向至下一个命令的输入(即把某个命令的输入当成时另一个命令的输入),不过前提是该指令要才能接受输入或形成输出。常见的指令有cat,less,grep等。输入输出用"|"来拼接。
(2)linuxshell在读取到$这个符号时,会先将它前面紧挨到的的字符视作变量名,并将$与变量名替换成变量的值,之后再将替换后的参数传给命令。这属于shell的特点expansion中的parameterexpansion,不仅parameterexpansion之外,还有pathnameexpansion,braceexpansion,commandsubstitution。
(3)与(2)相反,假如要忽视掉特殊符号,可以在右侧加破折号。双冒号会屏蔽除"","`","$"以外的所有特殊符号。单冒号会忽视掉所有特殊符号。
参考
不仅环境变量文件读取次序是参考网站的博客linux修改用户环境变量,其它内容皆参考自书本:TheLinuxCommandLine2ndEdititonACompleteIntroduction。
勘误校准2019年7月4日:(1)自定义变量时等号左右两侧都不能留空格。更改前我只提及了等号右边不能留空格。(2)parameterexpansion会将"$变量名"替换成变量的值。更改前的描述为把"$变量名"转化为变量名。(3)escapecharacter不属于expansion特点。更改前我把它归类到了expansion里。新增内容2019年7月4日:在“用户自定义变量”部分的末尾新增对自定义变量作用范围的描述。
以上是Linux环境变量来自哪些文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

CentOS 和 Ubuntu 的关键差异在于:起源(CentOS 源自 Red Hat,面向企业;Ubuntu 源自 Debian,面向个人)、包管理(CentOS 使用 yum,注重稳定;Ubuntu 使用 apt,更新频率高)、支持周期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社区支持(CentOS 侧重稳定,Ubuntu 提供广泛教程和文档)、用途(CentOS 偏向服务器,Ubuntu 适用于服务器和桌面),其他差异包括安装精简度(CentOS 精

CentOS 安装步骤:下载 ISO 映像并刻录可引导媒体;启动并选择安装源;选择语言和键盘布局;配置网络;分区硬盘;设置系统时钟;创建 root 用户;选择软件包;开始安装;安装完成后重启并从硬盘启动。

CentOS将于2024年停止维护,原因是其上游发行版RHEL 8已停止维护。该停更将影响CentOS 8系统,使其无法继续接收更新。用户应规划迁移,建议选项包括CentOS Stream、AlmaLinux和Rocky Linux,以保持系统安全和稳定。

CentOS系统下GitLab的备份与恢复策略为了保障数据安全和可恢复性,CentOS上的GitLab提供了多种备份方法。本文将详细介绍几种常见的备份方法、配置参数以及恢复流程,帮助您建立完善的GitLab备份与恢复策略。一、手动备份利用gitlab-rakegitlab:backup:create命令即可执行手动备份。此命令会备份GitLab仓库、数据库、用户、用户组、密钥和权限等关键信息。默认备份文件存储于/var/opt/gitlab/backups目录,您可通过修改/etc/gitlab

Docker利用Linux内核特性,提供高效、隔离的应用运行环境。其工作原理如下:1. 镜像作为只读模板,包含运行应用所需的一切;2. 联合文件系统(UnionFS)层叠多个文件系统,只存储差异部分,节省空间并加快速度;3. 守护进程管理镜像和容器,客户端用于交互;4. Namespaces和cgroups实现容器隔离和资源限制;5. 多种网络模式支持容器互联。理解这些核心概念,才能更好地利用Docker。

如何使用 Docker Desktop?Docker Desktop 是一款工具,用于在本地机器上运行 Docker 容器。其使用步骤包括:1. 安装 Docker Desktop;2. 启动 Docker Desktop;3. 创建 Docker 镜像(使用 Dockerfile);4. 构建 Docker 镜像(使用 docker build);5. 运行 Docker 容器(使用 docker run)。

CentOS硬盘挂载分为以下步骤:确定硬盘设备名(/dev/sdX);创建挂载点(建议使用/mnt/newdisk);执行mount命令(mount /dev/sdX1 /mnt/newdisk);编辑/etc/fstab文件添加永久挂载配置;卸载设备使用umount命令,确保没有进程使用设备。

CentOS 停止维护后,用户可以采取以下措施应对:选择兼容发行版:如 AlmaLinux、Rocky Linux、CentOS Stream。迁移到商业发行版:如 Red Hat Enterprise Linux、Oracle Linux。升级到 CentOS 9 Stream:滚动发行版,提供最新技术。选择其他 Linux 发行版:如 Ubuntu、Debian。评估容器、虚拟机或云平台等其他选项。
