千家信息网

CentOS中环境变量与配置文件的深入讲解

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,前言CentOS的环境变量配置文件体系是一个层级体系,这与其他多用户应用系统配置文件是类似的,有全局的,有用户的,有shell的,另外不同层级有时类似继承关系。本文将详细介绍关于CentOS环境变量与
千家信息网最后更新 2025年01月31日CentOS中环境变量与配置文件的深入讲解

前言

CentOS的环境变量配置文件体系是一个层级体系,这与其他多用户应用系统配置文件是类似的,有全局的,有用户的,有shell的,另外不同层级有时类似继承关系。

本文将详细介绍关于CentOS环境变量与配置文件的相关内容,下面话不多说了,来一起看看详细的介绍吧

什么是环境变量

bash shell用一个叫做 环境变量(environment variable) 的特性来存储有关shell会话和工作环境的信息。即允许在内存中存储数据,使得在程序或shell中运行的脚本能够访问它们。

在bash shell中,环境变量分为两类:

  • 全局变量
  • 局部变量

全局环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。

查看全局变量,可以使用env或printenv命令。

[root@dev ~]# envHOSTNAME=localhostTERM=linuxSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=10.0.100.17 56344 22SSH_TTY=/dev/pts/0USER=root[root@dev ~]# [root@dev ~]# printenvHOSTNAME=localhostTERM=linuxSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=10.0.100.17 56344 22SSH_TTY=/dev/pts/0USER=root[root@dev ~]# printenv TERMlinux

使用环境变量,通过 $ +变量名。

[root@dev ~]# echo $HOME/root

系统环境变量基本上都是使用大写字母,以区别于普通用户的环境变量。

局部环境变量

顾名思义,局部环境变量只能在定义它们的进程中可见。set命令会显示某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

[root@dev ~]# setBASH=/bin/bashBASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepathBASH_ALIASES=()BASH_ARGC=()BASH_ARGV=()BASH_CMDS=()BASH_LINENO=()BASH_SOURCE=()BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")BASH_VERSION='4.1.2(1)-release'COLORS=/etc/DIR_COLORSCOLUMNS=165

用户定义变量

一旦启动了bash shell,就能创建在这个shell进程内可见的局部变量。该进程创建的子shell无法读取父shell的局部变量。

[root@dev shell]# sh a.sh2222[root@dev shell]# cat a.sh#!/bin/basha=1;export b=2;sh b.shecho $b;[root@dev shell]# cat b.sh#!/bin/bashecho $a;echo $b;b=22;echo $b;[root@dev shell]# sh a.sh 2222

用户可以通过export变量,使变量变为全局变量,这样子shell也可以读取到。而子shell修改该变量,父shell中不受影响。

如果在子shell中设置环境变量,想要在父shell中读取呢?

一个使用场景是:多个执行脚本依赖于共同的环境配置,这个配置写在一个env.sh脚本里,如何使其他执行脚本可以读取到env.sh里变量?在子shell中export变量,并不能影响到父shell。

source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。

[root@dev shell]# cat c.sh. ./env.shsource ./profile.shecho $env;echo $profile;[root@dev shell]# cat env.shenv='test';[root@dev shell]# cat profile.sh profile="dev";[root@dev shell]# sh c.sh testdev

如果想要删除环境变量

unset var_name

设置全局环境变量

上文中,可以知道,如果想要在本进程和子进程中使用共同的环境变量。通过source命令去读取同一个环境变量脚本可以实现。这是用户自定义的方案。但很多时候,我们需要读取的全局环境变量并不知道source,所以需要一个默认的环境变量读取文件。

当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile

/etc/profile

/etc/profile文件是bash shell默认的主启动文件。只要你登录了Linux系统,bash就会执行/etc/profile启动文件的命令。

[root@dev shell]# cat /etc/profile# /etc/profile# System wide environment and startup programs, for login setup# Functions and aliases go in /etc/bashrc# It's NOT a good idea to change this file unless you know what you# are doing. It's much better to create a custom.sh shell script in# /etc/profile.d/ to make custom changes to your environment, as this# will prevent the need for merging in future updates.pathmunge () { case ":${PATH}:" in  *:"$1":*)   ;;  *)   if [ "$2" = "after" ] ; then    PATH=$PATH:$1   else    PATH=$1:$PATH   fi esac}if [ -x /usr/bin/id ]; then if [ -z "$EUID" ]; then  # ksh workaround  EUID=`id -u`  UID=`id -ru` fi USER="`id -un`" LOGNAME=$USER MAIL="/var/spool/mail/$USER"fi# Path manipulationif [ "$EUID" = "0" ]; then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbinelse pathmunge /usr/local/sbin after pathmunge /usr/sbin after pathmunge /sbin afterfiHOSTNAME=`/bin/hostname 2>/dev/null`HISTSIZE=1000if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignorebothelse export HISTCONTROL=ignoredupsfiexport PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL# By default, we want umask to get set. This sets it for login shell# Current threshold for system reserved uid/gids is 200# You could check uidgid reservation validity in# /usr/share/doc/setup-*/uidgid fileif [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then umask 002else umask 022fifor i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then  if [ "${-#*i}" != "$-" ]; then   . "$i"  else   . "$i" >/dev/null 2>&1  fi fidoneunset iunset -f pathmunge

该文件会读取/etc/profile.d/下所有的*.sh文件,通过点命令(source)来加载变量。即在/etc/profile和/etc/profile.d/*.sh定义的变量,都是全局的系统环境变量。

$HOME/.bash_profile

$HOME下的启动文件都是用户专属的启动文件,定义该用户的环境变量。而/etc/profile则是系统的,所有用户的环境变量。

shell会按照下列顺序,运行第一个找到的文件,余下被忽略:

  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile

.bashrc通过.bash_profile来调用。

[root@dev shell]# cat ~/.bash_profile # .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then  . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binexport PATH

总结:

将要设置的系统全局环境变量,比如JAVA_HOME,放在/etc/profile.d/目录下, 以*.sh脚本的形式定义。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

变量 环境 文件 全局 用户 命令 脚本 局部 系统 进程 配置 登录 内容 不同 体系 就是 层级 中设 存储 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网站怎么导入数据库 武汉空文网络技术 数据库在冷链物流管理有哪些应用 数据库面试有几种锁 筑牢网络安全防护线人物事迹 jsp获取数据库数据排列 海安问鼎软件开发工作室 5g手机软件开发 杭州泳漫网络技术有限公司 后端语言和数据库的关系 incopat数据库比对 扶风租房软件开发 下载时显示失败服务器出现问题 电视内部服务器错误怎么回事 湖南软件开发工程师工资 一台服务器运行多个java项目 360浏览器这么清除数据库 sql数据库信息查询 数据库的长链接和短连接 软件开发项目绩效计提比例 旭旭宝宝首秀卡爆服务器 网络安全工作室收入 数据分析师怎么登录数据库 文件服务器可以存储数据库吗 软件开发人员交接文档 身份识别的管理生物识别数据库 出库软件数据库怎么安装 徐州房地产网上数据库 大学里是不是都有自己的数据库 山东易速网络技术有限公司张涛
0