linux环境变量

一、声明

本文为学习整理笔记,转载请标明参考博文,与本文地址。

二、环境变量简介

1. 什么是环境变量

一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程(引用自https://blog.csdn.net/x00237053/article/details/77530277)。

2.个人理解

操作系统和用户程序在运行的时候,需要一些参数,而这些参数通过可以通过变量该引用。改变变量的值,可以改变系统和软件的运行。例如:linux系统下的”LANG”环境变量确定软件程序与用户通信的语言。

环境变量的含义及其值的格式由使用它的应用程序确定。有许多众所周知的环境变量,其含义和格式已经达成一致,并且它们被许多应用程序使用(引自https://help.ubuntu.com/community/EnvironmentVariables)。

2. 环境变量的构成

环境变量由分配了值的名称组成。例如,在常用的计算机系统中,”LANG”的默认值一般是”en_US.UTF-8″

三、环境变量的操作

1. 如何设置环境变量

1.1 更改现有环境变量的值:

LANG=HE_IL.UTF-8

1.2 设置新的环境变量:

export EDITOR=nano

2. 查看环境变量

2.1 查看系统所有环境变量

printenv查看系统目前所有的环境变量

printenv

2.2 查看单个环境变量

printenv USER

2.3 查看的单个环境变量

echo $USER

2.4 env命令
env命令可以用于对环境变量进行临时短期的更改。还可以用户显示当前环境的环境变量。

env

3. 删除环境变量

3.1 给变量赋值空值

export LC_ALL=

注意:在大部分情况下,给环境变量赋值空值,即可是环境变量失效。但是一些环境变量设置为空值,也会影响行为。所以不推荐此种方法删除环境变量。

3.2 使用 unset 命令

unset LC_ALL

3.3 使用 export 命令

export -n LC_ALL

注意:使用 export -n 命令是将环境变量变为普通的shell变量。但是变量的值还存在。

四、环境变量的工作原理

1. 局部性(Process locality)

环境变量的值是本地的,它们特定于设置它们或为其设置的运行过程。假如同事打开两个终端窗口(这意味着有两个单独的bash进程正在运行),在其中一个窗口中更改变量的值,另外一个窗口中的shell将看不到该更改。

2. 继承(Inheritance)

父进程创建子进程时,子进程会继承父进程的所有环境变量和父进程的值。例如从终端运行 “gedit”命令,并且”bash”(父进程) 创建 “gedit” (子进程)。 假如我们在终端中为 “LANG” 环境变量设置了一个新值,然后从同一个终端运行 “gedit”. “gedit”会继承 “LANG” 的新值,但是其他终端则不会继承,所以会与其它进程显示不同。

由于设置变量的 Process Locality 原则,一旦我们运行了子进程,对父进程环境变量的更改则不会再影响到已运行的子进程,反之亦然。

五、永久环境变量

上面设置的环境变量都是临时性的,当退出shell、终端的时候,设置的环境变量便不再生效。要设置永久性的环境变量,需要对一些文件进行配置。

永久性环境变量文件有两种,一个中是用户级,一种是系统级。

1. 用户级

~/.pam_environment

此文件专门用于设置用户的环境。 它不是一个脚本文件,而是由赋值表达式组成,每行一个。
此示例将变量FOO设置为文字字符串并修改PATH变量。

FOO=bar
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/MyPrograms

注意:
在进行像 FOO=bar 示例这样的简单变量赋值时,引号没有特殊含义。 这意味着值不能包含空格。

用于修改PATH的语法(与shell脚本文件的语法不同)是变量扩展工作所必需的。 某些变量(如HOME)可能在解析~/.pam_environment时未设置。 有关更多详细信息,请参阅/etc/security/pam_env.conf。

当您使用各种GUI设置语言或区域格式时,会写入~/.pam_environment。 因此,如果您例如通过手动编辑~/.pam_environment来设置LC_TIME,那么如果您之后使用语言支持GUI更改区域格式设置,则会覆盖您的条目。

~/.profile

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量,执行用户的.bashrc文件。
示例:

export FOO=bar
export PATH="$PATH:$HOME/MyPrograms"

注意:
~/.profile中的代码在读取~/.pam_environment之后运行。 这使得~/.profile适合使用,如果你想覆盖在~/.pam_environment中设置的与语言环境相关的变量,例如:语言支持。

~/.bashrc

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取

~/.bash_profile

当用户登入shell时执行

~/.bash_login

当用户登入shell时执行

2. 系统级

系统级的环境变量文件,适用于整个系统。主要涉及到以下几个文件:

/etc/environment

在登录时操作系统使用的第二个文件,系统在读取登陆用户的profile前,设置环境文件的环境变量。

/etc/profile.d/

此目录专门用于系统范围的环境变量设置。 目录下面是酉 “.sh”结尾的文件,”.sh” 不是一个脚本文件,而是由赋值表达式组成,每行一个。

FOO=bar

注意:
Note: Variable expansion does not work in /etc/environment.

/etc/profile.d/*.sh

无论何时输入bash登录shell(例如,从控制台登录或通过ssh登录),以及桌面会话加载时DisplayManager,都会执行/etc/profile.d目录中具有.sh扩展名的文件。

例如,可以创建文件/etc/profile.d/jdk.sh并设置这样的变量

exportVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin
/etc/profile

该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件. 目前网上关于修改环境变量都是建议加到此文件夹中,但它是base-files包的配置文件,因此不适合直接编辑改文件。(ubuntu建议)

/etc/default/locale

专门用于系统范围的语言环境变量设置。 它由安装程序编写,当您使用语言支持在系统范围内设置语言或区域格式时。 在桌面系统上,通常没有理由手动编辑此文件。

/etc/bash.bashrc

/etc/bash.bashrc:系统级的bashrc文件。
有时建议用于在系统范围内设置环境变量。 虽然这可能适用于从shell启动的程序的Bash shell,但默认情况下,该文件中设置的变量不可用于从桌面会话中的图形环境启动的程序。

sudo注意

使用 sudo 命令调用时,不会反映添加到这些位置的任何变量,因为 sudo 具有重置环境和设置安全路径的默认策略(此行为在 /etc/sudoers 中定义)。

作为一种解决方法,您可以使用 sudo su,它将为 shell 提供 root 权限,但保留任何已修改的 PATH 变量。

或者,您可以通过添加一些显式环境设置来设置 sudo 不重置某些环境变量以保留在 /etc/sudoers 中

运行sudo visudo
将以下内容添加到底部

Defaults env_keep += "http_proxy SOMEOTHERVARIABLES ANOTHERVARIABLE ETC"

六、linux 系统下 bash shell常见的环境变量

只针对ubuntu系统,其它系统可能有差异

1. 与文件位置相关的环境变量

以下变量确定系统如何定位各种文件以便操作

     变量       |            变量值             |            变量功能
PATH            | /usr/sbin:/usr/bin:/sbin:/bin | 键入要运行的命令时,系统将按照指定的顺序在PATH指定的目录中查找它
MANPATH         | /usr/share/man:/usr/local/man | 系统搜索手册页的目录列表
LD_LIBRARY_PATH | /opt/app/oracle/lib           | 系统搜索运行时库的目录列表,以及ld和/etc/ld.so.conf.d/*.conf文件中硬件定义的目录。注意:您只能在交互式shell中设置此环境变量。
TMPDIR          | /var/tmp                      | 用于多个程序创建临时文件的目录

2. 区域设置变量

以下环境变量确定系统的与语言环境相关的行为,例如显示的消息的语言以及显示时间和日期的方式。

可以分配给区域设置环境变量的值是系统上生成的区域设置的名称。 要查看已生成的语言环境,可以使用locale -a命令。

使用语言支持在Ubuntu中安装语言时,会自动生成该语言的语言环境。 否则,可以使用locale-gen命令生成语言环境。

       变量         |             变量功能
LANG                | 系统上的应用程序使用的基本语言设置,除非被其他一个区域设置环境变量覆盖
LC_CTYPE            |  用于显示和输入文本的字符集
LC_NUMERIC          |  如何在屏幕上格式化非货币数值
LC_TIME             |  如何格式化日期和时间值
LC_COLLATE          |  如何对各种信息项进行排序(例如,定义字母顺序,以便按排序命令按字母顺序排序项目)
LC_MONETARY         |  如何格式化货币数值
LC_MESSAGES         |  哪种语言是向最终用户显示消息
LC_PAPER            |  纸张格式和标准的定义
LC_NAME             |  名称的格式如何
LC_ADDRESS          |  如何显示地址信息
LC_TELEPHONE        |  电话号码的结构如何
LC_MEASUREMENT      |  使用什么计量单位
LC_IDENTIFICATION   |  有关区域设置信息的元数据
LC_ALL              |  此变量用作所有其他语言环境变量的强大覆盖。 设置其值后,应用程序将使用该值来确定要使用的区域设置,而不管其他变量的值如何。注意:请勿在桌面系统上持久设置此变量。 如果这样做,您可以有效地禁用用于控制语言和语言环境的GUI。

通过利用区域设置变量的各种设置组合,您可以对系统的行为进行有趣的调整。例如,您可以使用美国英语中的系统显示消息,同时使用欧洲国家/地区更常见的数字,日期和测量格式。语言支持GUI通过设计进行区分。
在某些组合中,区域设置变量可以有效地覆盖彼此的值。因此,检查变量本身的值可能并不总能清楚地表明系统的行为方式。 locale命令可用于检查应用程序的有效值。

LANGUAGE优先级列表

GUI上设置的“LANGUAGE”环境变量通常用于Ubuntu桌面,它控制GNU兼容应用程序的消息语言和菜单显示。对于此类应用程序,它将覆盖在“LANG”和“LC_MESSAGES”中设置的任何区域设置名称。
与“LANG”和“LC_ *”不同,“LANGUAGE”不应分配包括编码部分的完整语言环境名称(例如“.UTF-8”)。相反,“LANGUAGE”应包含一个冒号分隔的语言代码优先级列表,例如“es:​​de:en”。单一语言代码也是正确的。

3. Preferred application variables

这些环境变量向各种程序指示用户的首选应用程序用于执行某些任务的内容。
GUI应用程序通常不会遵循这些变量,这些应用程序往往包含自己的内置文本显示窗口和编辑器。 大多数桌面环境还包含自己的首选应用程序选择系统。

  变量  |      变量值      |          变量功能 
PAGER   |  /usr/bin/less   |  用于通过man等命令显示长文本的实用程序的名称。
EDITOR  |  /usr/bin/nano   |  用户首选文本编辑器的名称。 由诸如mutt邮件客户端和sudoedit之类的程序使用。
VISUAL  |  /usr/bin/gedit  |  与“EDITOR”环境变量类似,应用程序通常先尝试此变量中的值,然后再返回“EDITOR”(如果未设置)。

4. Program execution variables

可以说是最强大(但危险)的环境变量,以下允许调整软件实际运行的基本方式。

    变量      |       变量值            |   变量功能 
LD_PRELOAD    | /usr/lib/valgrind.so    |  此变量可用于在加载时将自定义动态库注入应用程序的内存中。 它可以用来做一些事情,比如用调试版替换应用程序的内置内存分配库,以便检测内存泄漏。 它还可以用于覆盖播放声音等各种事物的方式。

5. 编译和软件开发相关的变量

    变量      |             变量值                    |       变量功能 
CC            |  gcc                                  |  要使用的C编译器的名称
CXX           |  g++                                  |  要使用的C ++编译器的名称
CFLAGS        |  -o out.o                             |  A list of debugging/optimization flags to pass to the C compiler
CXXFLAGS      |  -Wall                                |  A list of debugging/optimization flags to pass to the C++ compiler
CPPFLAGS      |  -DDEBUG                              |  A list of flags to pass to the C/C++ pre-processor/compiler
LIBRARY_PATH  |  /usr/lib/firefox                     |  A list of directories (separated by colons) in which library files should be searched for
INCLUDE       |  /opt/app/src/include                 |  A colon-separated list of directories in which header files should be searched for
CPATH         |  ..:$HOME/include:/usr/local/include  |  A colon-separated list of directories in which header files should be searched for

6. 其他环境变量

    变量      |        变量值            |       变量功能 
USER          | myuser1                  |  当前登录用户的名称。 该变量由系统设置。 您可能不应手动更改其值。
LOGNAME       | myuser1                  |  与“USER”类似,某些程序更喜欢读取此变量而不是USER。
HOME          | /home/myuser1            |  当前登录用户主目录的位置。
PWD           | /home/myuser1/Desktop    |  shell的当前工作目录。
SHELL         | /bin/bash                |  The user's preferred command-line shell as it is set in the /etc/passwd file.
POSIXLY_CORRECT N/A If this environment variable exists, regardless of its value, it causes the behaviour of quite a few utilities to more closely match the behaviour defined by the POSIX standard. This typically makes various GNU extensions that make life easier not work, but it may just be what's needed to make an old UNIX script execute successfully.

HOSTALIASES   | /etc/host.aliases        |  The name of a file containing host-name aliases for use with various network programs.
TZDIR         | /usr/share/zoneinfo      |  The path of the directory containing time-zone information files. This typically does not need to be set manually, as the system searches for such files in /usr/share/zoneinfo by default.

TZ            | IST-2:Japan              |  This variable was used by older UNIX systems to specify the system's time-zone. However, Ubuntu and most other modern systems use the /etc/localtime file for that purpose. This variable can, however, be used to make one user's particular session display times in a different time-zone than the rest of the system.The value of this variable can either be the name and offset of a time-zone (as seen in the first example) or the name of a zone-info file in /usr/share/zoneinfo (as seen in the second example).

TERM          | xterm                    |  The name of a terminal information file from /lib/terminfo, this file instructs terminal programs how to achieve things such as displaying color. It may help to fiddle with this variable if you're trying use an odd terminal emulator program or trying to connect a hardware serial-port terminal emulator and getting undesired results.

TERMCAP       |                          |  This variable can be used instead of "TERM" to manually specify terminal information rather than point to a file.
COLUMNS       | 80                       |  The number of text columns in the terminal window. Try adjusting this variable if lines don't seem to wrap properly in the console.

LINES         | 25                       |  The number of text lines on the console window. Try adjusting this variable if you're getting strange results when scrolling text.

SDL_VIDEO_FULLSCREEN_DISPLAY | 0         |  In multiple monitor setups, such as Xinerama or TwinView, this sets which screen to use for full-screen mode for SDL applications/games. If unset all screens are used.

七、参考博客

EnvironmentVariables

图解操作系统环境变量

Previous Post

shell编程技巧

Next Post

linux性能调优工具大全

Related Posts