你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux 系统中环境变量和 Shell 变量如何设置?

[复制链接]
gaosmile 发布时间:2020-8-17 22:02

大家都知道,在 Linux 系统中,有环境变量和 Shell 变量这两种变量。

环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息。而 Shell 变量仅在当前 Shell 中可用,可以用来存储当前用户的 ID 等信息。

那么什么是环境变量,什么是 Shell 变量,该如何设置和查看这两种变量呢?

接下来,让我为你解答:
; m: K# `" R( s' D( P$ x' @
( J  {1 n+ c3 F" R9 H0 h5 F5 l5 s


0 w  \6 I$ E; o- d/ s/ p环境变量2 g2 M/ t! g# I; |/ C5 E$ L
# N7 Q5 w' f0 e+ M8 z. F5 g

环境变量是以键值对的形式实现的,是在整个系统范围内都可用的变量,并由所有派生的子进程和 Shell 继承。而环境变量的名称是区分大小写的,且通常以大写的形式命名 ( MYVAR1, MYVAR2... )

单个值的环境变量看起来是这样的:

  • KEY=value10 J2 Y, C  H. m% _* z

如果你想要将多个值赋予环境变量,则通常用冒号 ( : ) 作为分隔符。每一对键值对最终看起来是这样子的:

  • KEY=value1:value2:value3
    & h7 Z# z" z- r, T2 @

如果要赋予环境变量的值包含空格,则需要使用引号:

  • KEY="value with spaces": L" e6 Z! ?, y# l" A

4 V, V$ X- s9 O8 A/ `# rShell变量
6 L0 K5 a1 D2 P* u& `

. a+ o3 ^9 B, M/ F! c3 B' c" X

Shell 变量是专门用于设置或定义它们的 Shell 中的变量。每个 Shell ,例如 zsh 和 bash ,都有一组自己内部的 Shell 变量。它们通常用于跟踪临时数据,比如当前工作目录,而用法则与环境变量相同。

如果你想让 Shell 变量作为全局变量使用,可以使用 export 指令:


  1. ! T; r5 H3 p: x2 G$ V& Q
  2. $ export MYVAR=lxlinux.net9 y# o' T" j, n  ~1 b7 B
  3. $ echo $MYVAR; O1 r2 w" a# u: l3 N" H: O
  4. lxlinux.net
    $ U* j* d- T) ]* [" V% ^# T
  5. $ env | grep MYVAR
    * Y& A7 L( J5 H( V4 G( p' K
  6. MYVAR=lxlinux.net
复制代码
0 O( X* f; j  ]  H" u9 _
常见的环境变量与 Shell 变量
' ]  P2 A: b* C7 ^

* f+ f0 o$ d6 \' |6 U$ |! m8 }) k

一些环境变量和 Shell 变量是非常有用的,并且经常会被引用。以下是一些常见的,你以后可能会遇到的环境变量:

[td]
变量名
含义
TERM这指定运行 Shell 时要模拟的终端类型。可以针对不同的操作需求模拟不同的硬件终端。不过,你通常不需要管这个变量。
USER当前登录的用户
PWD当前的工作目录
OLDPWD上一个工作目录,这个变量由 Shell 保存,以便通过执行 cd - 切换回上一个工作目录。
LS_COLORS这定义了 ls 指令的颜色输出代码,用于向 ls 指令添加颜色输出。这通常用于区分不同的文件类型并使用户对文件类型等信息一目了然。
MAIL当前用户邮箱的路径
PATH系统在查找指令时会检查的目录列表。当用户输入一个指令时,系统将按此目录列表的顺序检查目录,以寻找相应的可执行文件。
LANG当前的语言和本地化设置,包括字符编码。
HOME当前用户的主目录
_上一个被执行的指令

除了以上这些环境变量,你也可能会经常遇到以下这些 Shell 变量:

[td]
变量名
含义
BASHOPTS执行 bash 时所启用的选项列表,这对于确定 Shell 环境是否按照预期的方式运行很有帮助。
BASH_VERSION人类可读格式的正在执行的 bash 版本
BASH_VERSINFO机器可读格式的正在执行的 bash 版本
COLUMNS用于设置绘制到屏幕上的输出信息的宽的列数
DIRSTACKpushd 和 popd 命令可用的目录堆栈。
HISTFILESIZE存储到文件中的命令历史记录的行数。默认为 ~/.bash_history 文件的行数。
HISTSIZE内存中允许存储的命令历史记录的行数,即 histroy 命令所能打印出来的行数。
HOSTNAME计算机的主机名
IFS内部字段分隔符,用于分隔命令行上的输入。默认以空格作为分隔符。
PS1定义主命令提示符。这用于定义启动 Shell 会话时命令提示符的外观。而 PS2 用于声明跨越多行的命令的命令提示符。
SHELLOPTS可以用 set 命令设置的 Shell 选项。
UID当前用户的 UID (用户 ID)
& F9 t* b5 A$ o3 {! I

, d2 h4 _2 v5 f% T查看 Shell 变量与环境变量
4 C" z, h- C2 [' B! v0 ~

! D5 S$ F9 Q; Y$ B; S

在 Linux 系统中,有以下几种命令可以让你查看环境变量:

env — 该命令可以让你在自定义的环境中运行程序,并且不需要改变当前的环境。当不带参数使用 env 命令时,它会打印出当前的环境变量列表。

printenv — 可以打印出所有的或者指定的环境变量。

set — 该命令可以设置或者删除 Shell 变量。当不带参数使用 set 命令时,它将打印出包括环境变量与 Shell 变量在内的所有变量以及 Shell 函数的列表。

默认状态下,env 和 printenv 的功能是完全相同的:


  1. ; l5 b  H) U; k- v
  2. $ printenv
    ! b* ^, G8 t- \. d$ S
  3. SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 226 V9 P4 Z2 C4 H3 S3 p: ?
  4. LESSCLOSE=/usr/bin/lesspipe %s %s' R' x5 V- I. t
  5. LANG=C.UTF-8# e  Y  W+ ^8 F8 W7 ?3 z
  6. XDG_SESSION_ID=5( d+ n. R( `7 o# ?$ S
  7. USER=alvin* L2 r! X2 H  T4 ?$ e) x
  8. MYVAR=lxlinux.net
    " x$ ^6 k+ P+ F1 z* W
  9. PWD=/home/alvin
    6 G( \! k6 Q5 M. o6 V7 m! w  h
  10. HOME=/home/alvin9 V( b3 ?5 g2 ]  U; h; _* e# K
  11. SSH_CLIENT=10.0.2.2 37182 22. _2 e. i$ B$ T) D! }9 U
  12. XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
    : ^* g% @( a1 d6 S  T
  13. SSH_TTY=/dev/pts/0+ P* A* G4 o( q3 N  ?4 w5 F
  14. MAIL=/var/mail/alvin8 d0 X* o1 \+ g8 D5 K  M- }
  15. TERM=xterm-256color
    1 A1 f2 D+ o8 @) x6 R$ p3 {/ _. B) ]
  16. SHELL=/bin/bash. o' N0 o- f. ?7 m* D* G  H
  17. SHLVL=1
    7 z+ P3 \4 _  z! c8 l
  18. LOGNAME=alvin
    ' f* q0 ]# M0 O: _2 E! J* D
  19. XDG_RUNTIME_DIR=/run/user/1000
    ' Q: F. V( Y, Q, q/ ]
  20. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin8 {1 Y; ~% ^6 {+ G, ?' z
  21. LESSOPEN=| /usr/bin/lesspipe %s, f- _$ Y5 s6 J( @% j# O
  22. _=/usr/bin/printenv
复制代码

只有在更具体的功能上才能体现出 env 命令与 printenv 命令的区别。例如,使用 printenv 命令,你可以请求单个变量的值:

  1. ) C2 q7 R3 d; N4 K
  2. $ printenv SHELL
    . O4 T3 V3 v2 F& ]& \& X, z
  3. /bin/bash5 y) d, r- T) i4 \- `
  4. $ printenv HOME. ]9 C& i* W3 T1 E$ W6 I1 \$ c
  5. /home/alvin" m1 ~9 G. b( e) L
  6. $ printenv MYVAR% j) H3 _4 K0 t( O- \- V, R
  7. lxlinux.net
复制代码

env 命令可通过将一组变量传递给命令来修改程序运行的环境:

  • env MYVAR=lxlinux.net command_to_run command_options8 y# R+ [4 ?' {

printenv 与 env 命令只能打印出环境变量,而如果你想打印出所有变量或者 Shell 函数的列表,你可以使用 set 指令。


  1. & Q  j- ^$ r' ]; }7 v  w
  2. $ set/ o3 Z; u3 Q5 I
  3. BASH=/bin/bash9 B" D" S* q+ \; h" f% ]
  4. BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
    9 I3 e; X& F: E4 a$ x
  5. BASH_ALIASES=()
    ) r$ R3 i  i2 d
  6. BASH_ARGC=()* S0 F0 \$ a: Y  P
  7. BASH_ARGV=()
    " V8 v4 B% h0 w5 }' p6 _3 `/ [
  8. BASH_CMDS=()
    ( j/ v9 q" g! |
  9. BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
    . |1 v& q7 j: a# d7 V: L
  10. BASH_LINENO=()+ H0 I! E, {( i- _* k
  11. BASH_SOURCE=()" s; s1 M- ]8 x9 D7 P' N" P/ `
  12. BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")7 y' V" c2 h- u. ]$ q
  13. BASH_VERSION='4.4.20(1)-release'2 l, V( a& D' B0 E& N0 {! Y# {, m
  14. COLUMNS=140* E# K7 O$ }2 o( j* {" Y
  15. DIRSTACK=()
    ( U2 y; Q1 H6 W+ j0 Y
  16. EUID=1000  t+ b4 |. E0 u) G
  17. GROUPS=()6 X0 N+ B9 x2 Q: c1 F( ^( b0 G
  18. HISTCONTROL=ignoreboth
    ' G4 k' Y6 V4 a* v* ~
  19. HISTFILE=/home/alvin/.bash_history& J) q' Y1 q* d2 p1 v( `
  20. HISTFILESIZE=20003 o! q8 t- I2 F2 h
  21. HISTSIZE=1000+ d( J+ _0 t  R, l: J' Z$ h
  22. HOME=/home/alvin1 M, d0 N! f+ d) ]* Z
  23. HOSTNAME=ubuntu-bionic( f2 U0 m/ A  H0 ]; @  H
  24. HOSTTYPE=x86_64
    4 ]" S( @+ Z, Y; A$ ]4 [/ X9 J
  25. IFS=[p=26, null, left][font=Tahoma][size=3][color=#000000]该命令将显示一个包含所有变量的大列表,因此你可能会希望将输出传递给 less 命令。[/color][/size][/font][/p][list]
    5 L6 M5 L$ e/ d  Y* A2 M
  26. [*][color=#000][font=Tahoma][size=3]$ set | less[/size][/font][/color]; D8 ?" G3 U. B. S0 d: X
  27. [/list][font=Tahoma][size=3][color=#000000]1 a, K/ ^" _! v- E
  28. [backcolor=rgb(255, 218, 81)][b]设置 Shell 变量与环境变量[/b][/backcolor]3 N. R2 f8 @3 d3 {& H1 W1 r5 U, ?
  29. [/color][/size][/font][b][font=Tahoma][size=3][color=#000000]- X1 w- Q3 _" m2 n/ k/ v
  30. [/color][/size][/font][/b][p=26, null, left][font=Tahoma][size=3][color=#000000]Linux 系统中可以设置环境变量的命令有以下几种:[/color][/size][/font][/p][p=26, null, left][font=Tahoma][size=3][color=#000000]set — 该命令可以设置或者取消设置 Shell 变量。当不带参数使用 set 命令时,它将打印出包括环境变量与 Shell 变量在内的所有变量以及 Shell 函数的列表。[/color][/size][/font][/p][p=26, null, left][font=Tahoma][size=3][color=#000000]unset — 该命令可以删除 Shell 变量以及环境变量。[/color][/size][/font][/p][p=26, null, left][font=Tahoma][size=3][color=#000000]export — 该命令可以设置环境变量。[/color][/size][/font][/p][p=26, null, left][font=Tahoma][size=3][color=#000000]为了更好地理解 Shell 变量和环境变量之间的区别,我们先从设置 Shell 变量开始讲,然后再讲环境变量。[/color][/size][/font][/p][p=26, null, left][font=Tahoma][size=3][color=#000000]先从在当前会话中定义一个 Shell 变量开始:[/color][/size][/font][/p][list]7 ^0 N7 ~; q( M% H7 H
  31. [*][color=#000][font=Tahoma][size=3]$ MYVAR=lxlinux[/size][/font][/color]
    * u2 t* ^5 E4 j: q- {
  32. [/list][p=26, null, left][font=Tahoma][size=3][color=#000000]你可以用 echo $MYVAR 来验证变量是否已设置:[/color][/size][/font][/p][code]: ?2 ^; N" ?( d, H! S- @
  33. $ echo $MYVAR6 Q& Q! O6 I; c9 J, R( r9 g
  34. lxlinux
复制代码

使用 printenv 命令检验该变量是否为环境变量:

  • $ printenv MYVAR
    9 F- I& _/ \! p1 ^  d

没有输出返回,这就意味着 MYVAR 变量并不是环境变量。

export 命令可以用来设置环境变量。要创建环境变量,只需用 export 命令将 Shell 变量导出为环境变量:

  • $ export MYVAR7 y2 b! d  y' {$ m; Z

你可以用以下语句检验:

  1. , W3 U: ?( `' R: r
  2. $ printenv MYVAR9 u4 F, o+ ?1 d, \4 w
  3. lxlinux
复制代码

当然,你也可以只用一行代码来设置环境变量:

  • $ export MYNEWVAR="My New Variable"
    8 r, j% |) D: y+ Z! K

但是以这种方式创建的环境变量只能用于当前会话,如果你打开一个新的 Shell 会话,或者退出登陆,所有的变量都将会丢失。

我们也可以将环境变量还原为 Shell 变量,或者将其完全删除:

MYVAR 变量被定义为环境变量,我们可以通过输入以下代码将其还原为 Shell 变量:

  • $ export -n MYVAR, a* ?* s2 V) I+ B2 j+ b

这样,MYVAR 变量就不再是环境变量了,但依然还是 Shell 变量。

无论是 Shell 变量还是环境变量,想要完全删除变量,都可以使用 unset 命令来删除:

  • $ unset MYVAR# S+ f( T! K  f

可以通过以下语句来验证 MYVAR 变量已经删除:

  • $ echo $MYVAR
    ' h  H3 B* k! z* N9 b7 i

由于变量已经删除了,所以没有任何返回。


2 R1 b( D: v% q0 g
* `. ~; F) W2 l& `) c1 i
环境变量的持久化! z9 c- a8 S2 S: T1 G+ Z6 }* @' F
# b$ O! S2 \( j. M' m

许多程序都需要使用环境变量来决定具体的执行方式,但是,我们并不希望每次启动新的 Shell 会话时都必须重新设置重要的变量,因此我们需要将重要的环境变量写入配置文件中。

Shell 会话有不同的启动方式,比如,连接到终端的交互式 Shell 与未连接到终端的非交互式 Shell,还有登录式 Shell 与非登录式 Shell, 而 bash Shell 会根据会话不同的启动方式而读取不同的配置文件。

但是,在大多数 Linux 发行版中,当你启动一个新的 Shell 会话时,一般都会从以下文件中读取环境变量:

/etc/environment — 使用此文件来设置系统范围内可用的环境变量。

/etc/profile — 每当 bash 登录 Shell 时,都会加载此文件中设置的变量。

~/.bashrc — 每个用户特定的 Shell 配置文件。例如, 如果你使用的是Bash,就可以在其中声明变量。

如果要将新的环境变量加载到当前的 Shell 会话中,可以使用source命令:

  • $ source ~/.bashrc
    6 S) `) _: [% M- H3 ?

如果你想要设置环境变量,你就可以考虑将其添加到 /etc/profile 、/etc/bash.bashrc 或 /etc/environment 文件中。

: D' ]& P# D1 J0 C

. G2 T- ^& I3 N& H: f9 \结论, t- h: Q3 h& d8 r: O  a

$ g8 ?2 }( Q9 H( Z" C! K: w

在本文章中,我们了解了一些常见的环境变量和 Shell 变量,也学习了如何设置和查看这些变量,其实这些变量一直都在我们的 Shell 会话中,而且对许多程序都很有用,有很多常见的场景都会引用到这些变量。希望这对你的工作也有帮助。如果你还对这两种变量有任何疑问,请留言告诉我呗!


3 p) H( ?, F) e) x+ S2 J \t\n'
, h0 Y! q* A& E) ?7 b$ k6 B; ILANG=C.UTF-80 y/ A) a( b. D# C( h* ]/ \
LESSCLOSE='/usr/bin/lesspipe %s %s'
  k) Y+ N, _/ m# e8 J  ELESSOPEN='| /usr/bin/lesspipe %s'" X/ b$ z( a4 X5 }) \
LINES=35
4 P( J/ l6 D2 }# I3 `LOGNAME=alvin
6 i' x/ Y& C% e% |9 T& g.....[/code]

该命令将显示一个包含所有变量的大列表,因此你可能会希望将输出传递给 less 命令。

  • $ set | less& L3 v, J  K: H# v

6 r7 Q. B2 O1 l/ b设置 Shell 变量与环境变量
- S1 h/ k# C/ h7 A% y5 U7 u0 Z

$ M) _4 W3 Q  _! t8 m4 ?

Linux 系统中可以设置环境变量的命令有以下几种:

set — 该命令可以设置或者取消设置 Shell 变量。当不带参数使用 set 命令时,它将打印出包括环境变量与 Shell 变量在内的所有变量以及 Shell 函数的列表。

unset — 该命令可以删除 Shell 变量以及环境变量。

export — 该命令可以设置环境变量。

为了更好地理解 Shell 变量和环境变量之间的区别,我们先从设置 Shell 变量开始讲,然后再讲环境变量。

先从在当前会话中定义一个 Shell 变量开始:

  • $ MYVAR=lxlinux
      L8 M2 e' b1 q3 t( ]7 ~2 x& J

你可以用 echo $MYVAR 来验证变量是否已设置:


  1. " W! w5 P+ O. Y& H) t! _
  2. $ echo $MYVAR
    . ^5 E& @, n$ T2 ]* L
  3. lxlinux
复制代码

使用 printenv 命令检验该变量是否为环境变量:

  • $ printenv MYVAR
    ! c; M; P8 \* B6 W% j5 H0 ?

没有输出返回,这就意味着 MYVAR 变量并不是环境变量。

export 命令可以用来设置环境变量。要创建环境变量,只需用 export 命令将 Shell 变量导出为环境变量:

  • $ export MYVAR
    % A' V. Q) R, I3 s# H

你可以用以下语句检验:

  1. 6 B, J- o) _1 [, p. ]
  2. $ printenv MYVAR- ^# s5 P- r/ [
  3. lxlinux
复制代码

当然,你也可以只用一行代码来设置环境变量:

  • $ export MYNEWVAR="My New Variable"
    0 r4 C& e9 o7 T( r

但是以这种方式创建的环境变量只能用于当前会话,如果你打开一个新的 Shell 会话,或者退出登陆,所有的变量都将会丢失。

我们也可以将环境变量还原为 Shell 变量,或者将其完全删除:

MYVAR 变量被定义为环境变量,我们可以通过输入以下代码将其还原为 Shell 变量:

  • $ export -n MYVAR
    , {, A# N* I; L  z: B

这样,MYVAR 变量就不再是环境变量了,但依然还是 Shell 变量。

无论是 Shell 变量还是环境变量,想要完全删除变量,都可以使用 unset 命令来删除:

  • $ unset MYVAR9 B4 }) |7 ^7 a6 `; }9 I

可以通过以下语句来验证 MYVAR 变量已经删除:

  • $ echo $MYVAR, a* R' \: Z: R& a: U

由于变量已经删除了,所以没有任何返回。


! j- e  V. N* `/ [+ z

. k+ k: a  s: p9 G! X9 H( Q, o环境变量的持久化* B! J6 s3 s9 f% z

6 N/ U# F( c4 S6 H

许多程序都需要使用环境变量来决定具体的执行方式,但是,我们并不希望每次启动新的 Shell 会话时都必须重新设置重要的变量,因此我们需要将重要的环境变量写入配置文件中。

Shell 会话有不同的启动方式,比如,连接到终端的交互式 Shell 与未连接到终端的非交互式 Shell,还有登录式 Shell 与非登录式 Shell, 而 bash Shell 会根据会话不同的启动方式而读取不同的配置文件。

但是,在大多数 Linux 发行版中,当你启动一个新的 Shell 会话时,一般都会从以下文件中读取环境变量:

/etc/environment — 使用此文件来设置系统范围内可用的环境变量。

/etc/profile — 每当 bash 登录 Shell 时,都会加载此文件中设置的变量。

~/.bashrc — 每个用户特定的 Shell 配置文件。例如, 如果你使用的是Bash,就可以在其中声明变量。

如果要将新的环境变量加载到当前的 Shell 会话中,可以使用source命令:

  • $ source ~/.bashrc
    ; ^7 d; Z, q" u2 G0 o; u

如果你想要设置环境变量,你就可以考虑将其添加到 /etc/profile 、/etc/bash.bashrc 或 /etc/environment 文件中。


8 [" \: Q. B) i+ O
5 Y& i% X, j! i, P( j" ^8 ~% M) m
结论0 I, T$ w6 S0 T1 m# l6 i. v. T
- i2 y" {: R) L: t

在本文章中,我们了解了一些常见的环境变量和 Shell 变量,也学习了如何设置和查看这些变量,其实这些变量一直都在我们的 Shell 会话中,而且对许多程序都很有用,有很多常见的场景都会引用到这些变量。希望这对你的工作也有帮助。如果你还对这两种变量有任何疑问,请留言告诉我呗!

0 y8 _! P, W; h5 Z
赞 收藏 评论0 发布时间:2020-8-17 22:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版