Linux上的环境变量及生效范围

前言

在Linux系统中,环境变量可以在多个地方配置,从全局到局部依次为:

  1. 系统级配置文件:

    • /etc/environment: 这个文件通常用于设置系统的全局环境变量。

      这些变量对所有用户和所有进程都有效。

    • /etc/profile: 这个文件用于设置系统范围的Shell变量和环境变量。

      但是它在所有用户登录时都会执行。

    • /etc/profile.d/: 这是一个目录,其中可以存放各种脚本文件,用于设置特定应用或服务的环境变量。

      这些脚本会在用户登录时由 /etc/profile 执行。

  2. 用户级配置文件:

    • ~/.bashrc: 这个文件主要用于设置Bash Shell的本地变量和别名。

      它通常在每次启动一个新的Bash Shell时执行。

    • ~/.bash_profile~/.profile: 这些文件在用户登录时执行,用于设置用户级别的环境变量。

      通常 ~/.bash_profile 会在 ~/.bashrc 之前执行。

    • ~/.pam_environment: 这个文件用于设置用户的个人环境变量,类似于 /etc/environment,但只对当前用户有效。

  3. 会话级配置(当前Shell):

    • export 命令:可以在当前Shell会话中使用 export 命令直接设置环境变量。

      这些变量只对当前Shell及其子进程有效。

    • source 命令:可以使用 source 命令执行脚本或读取配置文件,以将变量设置到当前Shell会话中。

  4. 进程级配置:

    • 通过程序的启动命令行参数传递环境变量。

      例如,使用 env 命令或直接在命令前设置变量,如 VAR=value command

      这些变量只对该命令的进程及其子进程有效。

总结:

  • 全局配置:/etc/environment/etc/profile/etc/profile.d/
  • 用户配置:~/.bashrc~/.bash_profile~/.profile~/.pam_environment
  • 会话配置:使用 exportsource 命令
  • 进程配置:通过命令行参数传递环境变量

系统级

/etc/environment中不能写脚本,只能写键值的方式

我测试的这样配置 配置后在init.d中的脚本里依旧无法读取。

AI的答复:

/etc/environment文件是为交互式shell设计的,而init.d脚本通常是为非交互式shell运行的。

/etc/environment中设置的环境变量只会在登录时被读取,而不是为所有的进程加载。

编辑

1
vi /etc/environment

内容

1
JAVA_HOME="/usr/local/jdk/bisheng-jdk1.8.0_422"

生效

1
source /etc/environment

服务中环境变量生效

/etc/profile 文件通常在用户登录时由用户会话(如 bash 会话)读取并执行。

init.d 脚本是在系统启动时由 init 进程(或 systemd)执行的,它们运行在系统级别,而不是用户会话级别。

所以init.d 中的脚本读取不到 /etc/profile 文件中的环境变量。

我们可以使用. /etc/profile进行手动加载。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/sh
# chkconfig: 2345 85 15
# description:auto_run

#Tomcat根位置
TOMCAT_ROOT=/data/tools/apache-tomcat-8.5.99/

# 手动加载 /etc/profile
. /etc/profile

javahome() {
echo "Show JAVA_HOME"
echo $JAVA_HOME
}

#开始方法
start() {
cd $TOMCAT_ROOT
./bin/startup.sh
}

#结束方法
stop() {
cd $TOMCAT_ROOT
./bin/shutdown.sh
}

case "$1" in
javahome)
javahome
;;
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Userage: $0 {start|stop|restart}"
exit 1
esac