如何设置用户环境变量?(永久,不是会话)

161 path environment-variables

这让我很恼火。我看到了几个建议(都使用不同的文件和语法),但都没有奏效。

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

Mat*_*teo 131

您必须将声明放在 shell 的初始化文件中:

  • 如果您使用的是 bash、ash、ksh 或其他一些 Bourne 风格的 shell,您可以添加

    ABC="123"; export ABC
    
    Run Code Online (Sandbox Code Playgroud)

    在您的.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"
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 如果您正在使用另一个 shell,请查看 shell 手册如何定义环境变量以及在 shell 启动时执行哪些文件。

  • 因为所有与 Bourne 兼容的 shell 都会读取 `.profile`,所以不应在该文件中编写 Bash 语法。特别是`export VARIABLE=value`需要重构为`VARIABLE=value; 出口变量`。 (9认同)
  • `su user` 的默认行为是将当前 shell 的所有权更改为用户名 arg,同时保留调用用户的主目录和环境。要以成为新用户的方式进入 shell 并获取其所有环境设置($PATH、$HOME、$ABC 等),您需要将 - 作为第一个参数传递给 su。`su - username` 将完成您的要求。 (6认同)

小智 55

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

ABC="123"
Run Code Online (Sandbox Code Playgroud)

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

source /etc/environment
Run Code Online (Sandbox Code Playgroud)

并运行echo $ABC

  • 小心`/etc/environment` 不支持完整的 bash 语法,这是我很难想到的。例如,将 `PATH="/usr/bin:/usr/sbin"` 然后在下一行上执行 `PATH="$PATH:/foo/bar"` 将不起作用 (5认同)
  • +1 用于源命令。所有答案中都缺少这一点 (4认同)

l0b*_*0b0 9

这是一个可以用于几乎任何 shell 的通用过程。在任何情况下,您都必须知道用户通常使用哪个 shell 登录:

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

然后你必须弄清楚这个 shell 通常会读取哪些点文件:

man $shell
Run Code Online (Sandbox Code Playgroud)

一个可能有效的快捷方式是列出那些包含 shell 名称的点文件:

ls ~/.*${shell}*
Run Code Online (Sandbox Code Playgroud)

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

echo .bashrc
Run Code Online (Sandbox Code Playgroud)

登录时,您应该看到正在读取哪些文件,您可以决定修改哪个文件。请注意,您不应该尝试使用echo "$0"或类似,因为 的值$0取决于外壳程序如何处理点文件,并且可能会产生误导。

当谈到“永久”声明变量时,请注意这仅扩展到会话。没有会话就无法访问变量的值,因此它没有任何意义。如果你的意思是“只读”,那就是依赖于 shell,在Bash 中你可以使用:

declare -r VAR
Run Code Online (Sandbox Code Playgroud)

如果它已经有一个值,或者

declare -r VAR=value
Run Code Online (Sandbox Code Playgroud)

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

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

name="John Doe"
ip=127.0.0.1
HORRIBLE=1
Run Code Online (Sandbox Code Playgroud)


who*_*ami 6

使用导出。

export ABC="123"
Run Code Online (Sandbox Code Playgroud)

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

env
Run Code Online (Sandbox Code Playgroud)

和/或

env | grep ABC
Run Code Online (Sandbox Code Playgroud)

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

export ABC="123"
Run Code Online (Sandbox Code Playgroud)

  • 他想知道热定义它_permanently_,即,在哪个文件中放置定义。 (6认同)
  • 什么是“渗透”?你的意思是“永久”吗? (6认同)
  • 你的意思是“渗透”而不是“永久”:D (2认同)