关键词:
什么是环境变量
bash shell用一个叫做 环境变量(environment variable) 的特性来存储有关shell会话和工作环境的信息。即允许在内存中存储数据,使得在程序或shell中运行的脚本能够访问它们。
在bash shell中,环境变量分为两类:
- 全局变量
- 局部变量
全局环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。
查看全局变量,可以使用env
或printenv
命令。
[[email protected] ~]# env
HOSTNAME=localhost
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.100.17 56344 22
SSH_TTY=/dev/pts/0
USER=root
[[email protected] ~]#
[[email protected] ~]# printenv
HOSTNAME=localhost
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.100.17 56344 22
SSH_TTY=/dev/pts/0
USER=root
[[email protected] ~]# printenv TERM
linux
使用环境变量,通过 $
+变量名。
[[email protected] ~]# echo $HOME
/root
系统环境变量基本上都是使用大写字母,以区别于普通用户的环境变量。
局部环境变量
顾名思义,局部环境变量只能在定义它们的进程中可见。set
命令会显示某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。
[[email protected] ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_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_COLORS
COLUMNS=165
用户定义变量
一旦启动了bash shell,就能创建在这个shell进程内可见的局部变量。该进程创建的子shell无法读取父shell的局部变量。
[[email protected] shell]# sh a.sh
2
22
2
[[email protected] shell]# cat a.sh
#!/bin/bash
a=1;
export b=2;
sh b.sh
echo $b;
[[email protected] shell]# cat b.sh
#!/bin/bash
echo $a;
echo $b;
b=22;
echo $b;
[[email protected] shell]# sh a.sh
2
22
2
用户可以通过export
变量,使变量变为全局变量,这样子shell也可以读取到。而子shell修改该变量,父shell中不受影响。
如果在子shell中设置环境变量,想要在父shell中读取呢?
一个使用场景是:多个执行脚本依赖于共同的环境配置,这个配置写在一个env.sh脚本里,如何使其他执行脚本可以读取到env.sh里变量?在子shell中export变量,并不能影响到父shell。
source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。
[[email protected] shell]# cat c.sh
. ./env.sh
source ./profile.sh
echo $env;
echo $profile;
[[email protected] shell]# cat env.sh
env='test';
[[email protected] shell]# cat profile.sh
profile="dev";
[[email protected] shell]# sh c.sh
test
dev
如果想要删除环境变量
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启动文件的命令。
[[email protected] 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 manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin after
fi
HOSTNAME=`/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export 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 file
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "$-#*i" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
unset i
unset -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来调用。
[[email protected] shell]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
总结:
将要设置的系统全局环境变量,比如JAVA_HOME,放在/etc/profile.d/目录下, 以*.sh脚本的形式定义。
centos7设置环境变量(代码片段)
目录一、环境变量的概念1、环境变量的含义2、环境变量的分类3、Linux环境变量二、常用的环境变量1、查看环境变量2、常用的环境变量三、设置环境量1、系统环境变量2、用户环境变量3、环境变量脚本文件的执行顺序四、重要... 查看详情
webpack和项目配置环境变量(代码片段)
目录介绍1.方案1 1.1 webpack中环境变量配置1.2.env 文件2方案23方案3 介绍package.json中--mode配置的值只能在node环境中读到package.json中--env配置的值只能在浏览器环境中读到 平时开发要区分环境,js中和webpack中都需要读到环境变... 查看详情
webpack和项目配置环境变量(代码片段)
目录介绍1.方案1 1.1 webpack中环境变量配置1.2.env 文件2方案23方案3 介绍package.json中--mode配置的值只能在node环境中读到package.json中--env配置的值只能在浏览器环境中读到 平时开发要区分环境,js中和webpack中都需要读到环境变... 查看详情
systemdservice文件中配置环境变量(代码片段)
Systemdservice文件中配置环境变量问题描述:Systemd是所有服务的父进程,/etc/profile等配置的环境变量对其无效官方告诉可以使用Environment以及EnvironmentFile为服务进程配置环境变量*.service[Service]...EnvironmentFile=-/etc/sysconfig/tes... 查看详情
systemdservice文件中配置环境变量(代码片段)
Systemdservice文件中配置环境变量问题描述:Systemd是所有服务的父进程,/etc/profile等配置的环境变量对其无效官方告诉可以使用Environment以及EnvironmentFile为服务进程配置环境变量*.service[Service]...EnvironmentFile=-/etc/sysconfig/tes... 查看详情
ubuntu环境变量(代码片段)
使用Ubuntu进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题。本文将介绍UbuntuLinux系统... 查看详情
centos7装rabbitmq,rabbitmq-pluginsenablerabbitmq_management出问题(代码片段)
...rlang和RabbitMq装好后我的centos7里也要和windous一样配置一下环境变量呀,我没有配置,我的解决方法:配置Erlang环境变量,vi/etc/profile文件(这文件要root权限,不然是只读文件,给用户加权限也可以),增加下面的环境变量:#seterlang... 查看详情
vuecli中环境变量和模式(代码片段)
环境变量配置环境变量可以在以下文件中配置:.env#在所有的环境中被载入.env.local#在所有的环境中被载入,但会被git忽略.env.[mode]#只在指定的模式中被载入.env.[mode].local#只在指定的模式中被载入,但会被git忽略(.local优先于.env... 查看详情
centos部署jenkins(代码片段)
...些出入,问题自己解决即可。第一步要先安装jdk,并配置环境变量第二步安装tomcat,并设置环境变量第三步安装maven,并设置环境变量第四步将jenkins.war包放到tom 查看详情
centos7安装javatar.gz(代码片段)
文章目录1.创建文件夹2.解压3.配置环境变量1.创建文件夹$mkidr/usr/local/java2.解压>tar-zxvfjdk-17_linux-x64_bin.tar.gz-C/usr/local/java/3.配置环境变量编辑配置文件>vim/etc/profile配置环境变量exportJAVA_HOME=/usr/local/java/jdk1.8.0_171e 查看详情
centos环境变量配置
CentOS系统下如何将PHP和mysql命令加入到环境变量中,在LinuxCentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行“php-v”命令查看当前php版本信息时时,... 查看详情
centos一键部署lamp,shell脚本和搭建教程(代码片段)
这个教程可以在无网络环境搭建部署,几条命令搞定。linux系统上自动搭建lamp环境1.下载这些东西,或者直接下载我的压缩包ps:里面的内容如图,是一些安装包和一个脚本(脚本内容在最后)用xshell里的xftp把... 查看详情
liunx(centos)安装和配置java环境(代码片段)
1、安装方法CentOS8上使用yum直接安装,环境变量自动配置好,减少配置动作,提高效率.如果没有特殊要求,安装opendjdk就可以了,满足大部分程序需求 2、查看是否已安装看到下面结果,说明已经安装配... 查看详情
centos7环境下ssh端口修改笔记(代码片段)
CentOS7环境下SSH端口修改笔记说明:CentOS7服务器环境,默认SSH端口为22,考虑到安全方面问题,欲修改端口为62231(机器内网IP为192.168.1.31)ssh配置文件和iptables中端口开放配置调整时,原先的先不要移除,显式的同时打开22和62231端口... 查看详情
linux基础(04)功能配置(调整防火墙静态ip环境变量)(代码片段)
...、NAT、仅主机 2.2、常见问题三、centos配置静态IP四、环境变量 一些笔记: 直接命令改环境变量是临时的,如exportPATH=aaa 进入/etc/profile的文件里添加是永久的,且对所有用户生效。 一、Centos防火墙 ... 查看详情
centos安装jdk配置环境变量(代码片段)
1、验证是否有安装java-version 2、如果需要升级新版本JDK或者想要重新安装JDK,则需要先卸载原先的JDK yum-yremovejava*3、查看yum源中java资源列表 命令:yumlistjava* 4、选择版本安装yum-yinstalljava-1.8.0* 5、查看位置 ... 查看详情
centos7.4配置虚拟环境(代码片段)
environmentCentos7.4Python3.7downloadpipisntallvirtualenvcreateenvironmentvirtualenvenvironment_name#forexample:virtualenvvenv1这一步在创建虚拟环境的时候,可能会提示你-bash:virtualenv:未找到命令这说明virtualenv并没有添加到环境变量中,有两种解决办 查看详情
vue中.env文件配置环境变量(代码片段)
...1️⃣文件说明.env:全局默认配置文件,无论什么环境都会加载合并。.env.development:开发环境的配置文件.env.production:生产环境的配置文件注意:三个文件的文件名必须按.env方式命名,不能乱起名,否... 查看详情