在Linux中使用Bash设置环境变量

86

tcsh 中,我有以下脚本可用:

#!/bin/tcsh
setenv X_ROOT /some/specified/path

setenv XDB    ${X_ROOT}/db
setenv PATH   ${X_ROOT}/bin:${PATH}

xrun -d xdb1 -i $1 > $2

在Bash中,tcsh setenv函数的等效函数是什么?

是否有直接对应的函数?环境变量用于定位可执行文件。

5个回答

128

export VAR=value会把VAR设置为value。如果想要带有空格,需要用单引号括起来,例如export VAR='my val'。如果想要变量插值,可以使用双引号,例如export VAR="$MY_OTHER_VAR"


5
不需要在最后一个内容中使用双引号,因为Shell不会对变量赋值进行单词拆分。 - Jens
2
仅供初学者参考。我一开始并没有直接理解它,这里用普通英语来解释:插值“$X”在这里意味着你已经有一个变量X,其中填充了一个值,例如“A”,你想先读取该值“A”,然后将此值分配为VAR的值。当然,你不希望VAR在这里成为字符串“$X”。然后上面的注释似乎也很合理,你甚至不需要“”。如果要直接赋值“A”,请使用‘A’。如果我理解有误,请纠正我。 - questionto42
关于插值变量的最终注释会获得额外加分。 - skittlebiz

42

人们经常建议写作的原因是

VAR=value
export VAR

相比更短的而言

export VAR=value

更长的形式在比较多的shell中都可以使用,如果你知道你正在处理bash,则两种形式都可以使用。


33

如何在Linux上使用Bash设置本地变量和环境变量

在Bash中检查名为LOL的本地或环境变量:


el@server /home/el $ set | grep LOL
el@server /home/el $
el@server /home/el $ env | grep LOL
el@server /home/el $

检查一下,没有叫做LOL的本地变量或环境变量。

在本地设置一个名为LOL的本地变量,但不要设置为环境变量。因此进行设置:

el@server /home/el $ LOL="so wow much code"
el@server /home/el $ set | grep LOL
LOL='so wow much code'
el@server /home/el $ env | grep LOL
el@server /home/el $

变量'LOL'存在于本地变量中,但不存在于环境变量中。如果您重新启动终端、注销/登录或运行exec bash,LOL将会消失。

在Bash中设置本地变量,然后清除所有本地变量

el@server /home/el $ LOL="so wow much code"
el@server /home/el $ set | grep LOL
LOL='so wow much code'
el@server /home/el $ exec bash
el@server /home/el $ set | grep LOL
el@server /home/el $

您也可以仅取消设置一个变量:

el@server /home/el $ LOL="so wow much code"
el@server /home/el $ set | grep LOL
LOL='so wow much code'
el@server /home/el $ unset LOL
el@server /home/el $ set | grep LOL
el@server /home/el $

本地变量LOL已经消失了。

将本地变量提升为环境变量:

el@server /home/el $ DOGE="such variable"
el@server /home/el $ export DOGE
el@server /home/el $ set | grep DOGE
DOGE='such variable'
el@server /home/el $ env | grep DOGE
DOGE=such variable
注意导出变量将其显示为本地变量和环境变量。
导出的变量DOGE在Bash重置后仍然存在。
el@server /home/el $ exec bash
el@server /home/el $ env | grep DOGE
DOGE=such variable
el@server /home/el $ set | grep DOGE
DOGE='such variable'

取消所有环境变量设置:

你需要使用“Chuck Norris”的力量,在不注销/登录的情况下重置所有环境变量:

el@server /home/el $ export CAN="chuck norris"
el@server /home/el $ env | grep CAN
CAN=chuck norris
el@server /home/el $ set | grep CAN
CAN='chuck norris'
el@server /home/el $ env -i bash
el@server /home/el $ set | grep CAN
el@server /home/el $ env | grep CAN

你创建了一个环境变量,然后重置了终端以摆脱它们。

或者你可以像这样手动设置和取消设置环境变量:

el@server /home/el $ export FOO="bar"
el@server /home/el $ env | grep FOO
FOO=bar
el@server /home/el $ unset FOO
el@server /home/el $ env | grep FOO
el@server /home/el $

14

VAR=value 设置 VAR 的值为 value。

之后,export VAR 也会将其传递给子进程。

export VAR=value 是一个简写形式,两者均可实现。


3
它不是把变量传给子进程,而是传回给父进程吗?如果一个 shell 脚本进行了导出操作,那么我调用它的 shell 就会有那个变量,如果我没记错的话。 - rmeador
3
意思是,被标记为“自动导出到后续执行命令的环境”的变量,会在导出后被子进程继承并执行。 - iny
1
只是出于好奇,那个引用来自哪里? - pbh101

8

我认为你要找的是export命令 - 不过我可能错了。因为我以前从未使用过tcsh。请使用以下语法:

export VARIABLE=value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接