如何设置用户环境变量?(永久而非会话)


145

这很烦我。我看到了一些建议(都使用不同的文件和语法),但没有一个起作用。

如何为特定用户设置环境变量?我正在挤压debian。我应该在文件中放入ABC =“ 123”的确切语法是什么?


7
您已经尝试了什么?
l0b0 2011年

1
编辑.bashrc,.bash_profile,.profile和.ssh / eviroment。尽管我不知道我是每次在正确的位置编写它还是使用正确的语法

4
.bashrc是最主要的地方。
rozcietrzewiacz 2011年

@rozcietrzewiacz:好的,但是...即使有了解决方案,我也尝试在该文件的开头和结尾处设置ABC1和ABC2,但它并未在我的环境中设置。

1
检查是否.bash_profile包含类似的内容[[ -f ~/.bashrc ]] && . ~/.bashrc
rozcietrzewiacz 2011年

Answers:


113

您必须将声明放入外壳的初始化文件中:

  • 如果您使用的是bash,ash,ksh或其他Bourne风格的外壳,则可以添加

    ABC="123"; export ABC
    

    在您的.profile文件(${HOME}/.profile)中。在大多数Unix安装中,尤其是在Debian中,这是默认情况。

    如果您的登录shell是bash,则可以使用.bash_profile${HOME}/.bash_profile)或.bash_login代替。

    注意:如果存在这些文件中的任何一个,并且您的登录shell是bash,.profile则在通过ssh或在文本控制台上登录时不会被读取,但是仍然可以读取它,而不是.bash_profile从GUI登录。另外,如果没有.bash_profile,请使用.bashrc

  • 如果已将zsh设置为登录shell,请使用~/.zprofile代替~/.profile

  • 如果您使用的是tcsh,请添加

    setenv ABC "123"
    

    .login文件(${HOME}/.login)中

  • 如果使用的是其他Shell,请参阅Shell手册,了解如何定义环境变量以及在Shell启动时执行哪些文件。


5
的默认行为su user是将当前外壳的所有权更改为用户名arg,同时保留调用用户的主目录和环境。要以某种方式进入外壳程序并成为新用户并获得其所有环境设置($ PATH,$ HOME,$ ABC等),您需要传递-作为su的第一个参数。 su - username会满足您的要求。
蒂姆·肯尼迪

1
等待:“退出root”是什么意思?在任何情况下,执行“ su”都不会初始化外壳。您需要“ su-”(请参阅man su
-Matteo

1
你为什么su首先呢?您是否只是创建了一个用户.profile无法使用的根拥有者?
rozcietrzewiacz 2011年

1
@acid这是应该做的。现在的问题是,当你登录什么是采购。要检查,记录第一位。
rozcietrzewiacz 2011年

7
因为.profile所有兼容Bourne的外壳程序都读取了Bash语法,所以您不应在该文件中编写Bash语法。特别是,export VARIABLE=value需要将其重构为VARIABLE=value; export VARIABLE
Tripleee

47

使用/etc/environment文件来设置环境变量。然后在/etc/environment文件中添加以下行。

ABC="123"

现在,可以从所有用户会话访问ABC变量。要测试变量输出,请先使用命令刷新环境变量

source /etc/environment

然后跑echo $ABC


4
源命令+1。在所有答案中都缺少这一点
Nerrve

5
请注意,/etc/environment它不支持完整的bash语法,这是我很难解决的问题。例如,放置PATH="/usr/bin:/usr/sbin"然后PATH="$PATH:/foo/bar"在下一行上执行将不起作用
user2428118

不确定这是个人问题还是其他原因,但是/etc/environment即使重新启动bash终端或键入,我也必须在设置此设置后重新启动操作系统source /etc/environment。因此,如果遇到环境变量无法永久保存的问题,请尝试重新启动。
Blairg23 '18

9

这是一个通用过程,几乎可以用于任何shell。无论如何,您都必须知道用户通常使用哪个shell登录:

path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"

然后,您必须确定此外壳程序通常会读取哪些点文件:

man $shell

一种可行的快捷方式是列出包含外壳程序名称的那些点文件:

ls ~/.*${shell}*

如果要检查登录期间是否实际读取了其中一个文件,则可以简单地在每个文件中打印文件名,例如:

echo .bashrc

登录时,您应该查看正在读取的文件,然后可以决定修改哪个文件。注意不要使用echo "$0"或类似方法,因为的值$0取决于外壳处理点文件的方式,并且可能会引起误解。

当涉及到“永久”声明变量时,请注意,这仅扩展到会话。没有会话就无法访问变量的值,因此它在一个变量之外没有任何意义。如果您的意思是“只读”,那就是外壳相关的,在Bash中,您可以使用:

declare -r VAR

如果它已经具有值,或者

declare -r VAR=value

同时分配它。并非所有的外壳程序都具有此功能。

要在大多数shell中声明一个变量,应使用变量名([A-Za-z_][A-Za-z0-9_]*),后跟一个等号(等号周围没有空格),然后是一个值(除非该值是simple,否则最好加引号[A-Za-z0-9_]+)。例如:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1

5

使用导出。

export ABC="123"

要检查是否已设置,请使用

env

和/或

env | grep ABC

要永久添加,请将其添加到~/.bashrc文件中。

export ABC="123"

6
他想知道永久定义它的热点,即将定义放在哪个文件中。
Matteo

1
不起作用。一旦注销,变量就消失了。我需要跨会话使用它

1
你的意思permenate不是permenently:D
whoami

看看编辑bashrc
whoami

5
什么permenate?你的意思是permanent
SSH

3

确切的命令是:

echo 'export ABC = "123"' >> ~/.profile

4
究竟?认真吗 什么外壳程序(a)读取~/.profile而(b)之前和之后留有空间=
G-Man

1

对我有用的最好方法是在BASH shell中修改.bashrc文件。

例如使用此:

  1. 打开您的.bashrc文件
  2. 添加此行:

    export <VARIABLE> = "<ANY PATH/VALUE you want>"
    

    例如: export HOME = "/home/user/"

    请记住使用,""因为使用' '将无法正常工作,并且您的bashrc文件将在采购时报告错误。

  3. 在当前会话中获取它。

我还尝试修改/ etc / environment文件,但是它不允许我创建新的环境变量,当我获取它时,它提示错误,找不到定义的变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.