Unix
设置个人环境变量有约定吗?我读到它们应该被放入$HOME/.bash_profile
而不是$HOME/.bashrc
.尽管如此,我正在考虑提供一种方法来区分我自己的变量。这样即使我忘记了,我也能一眼看出它是否是我设置的。例如,当我在终端中进行自动完成时,我可以使变量以下划线或减号“m”开头,就像C++
语言约定之一一样。我知道可能没有绝对的答案,但我想听听一些有助于实现此目的的良好实践和约定:提供一种简单的方法来区分系统环境变量和个人环境变量。
答案1
在哪里设置环境变量包含在设置环境变量的最佳发行版/与 shell 无关的方法是什么?
关于命名,设置环境变量的主要原因是因为应用程序使用它们,所以您无法选择名称。
环境变量没有命名空间的概念。最接近的是选择一个前缀,通常是以下形式SOMETHING_
(即前缀以下划线结尾,并且有变量SOMETHING_FOO
, SOMETHING_BAR
, ...)。但大多数变量并不是针对特定的应用程序,而是针对一系列应用程序。如果变量仅在一个应用程序中有意义,那么它通常应该是命令行选项。所以对命名空间的需求并不大。
如果您定义的变量仅供在命令行上使用,则不要使用环境变量,请使用壳变量。 (看bash中环境变量和导出环境变量的区别) 如果您在 shell 脚本中定义变量并且不使用export
,那么这是一个 shell 变量,而不是环境变量,并且它仅在您定义它们的 shell 中可见。因此,如果您定义一个在命令行上使用的变量:
- 在 shell 交互式启动文件中定义它(
~/.bashrc
对于 bash、~/.zshrc
zsh、~/.config/fish/config.fish
fish)。 - 别这样
export
。 - 有一个普遍的约定:环境变量全部大写,shell 变量全部小写。
为了您自己的使用,选择您喜欢的任何名称,只要它们不与您使用的环境变量冲突(环境变量会自动导入为 shell 变量)。我不建议开头使用下划线,因为这是 bash 和 zsh 的补全系统内部使用的。
答案2
以下是我对在何处设置环境的建议以及解释。
相关详情如下:
用户配置文件是
~/.bash_profile
、~/.bash_login
、 或~/.profile
。我建议使用前两个之一,因为最后一个与其他外壳重叠。不过,请参阅最后有关 GUI 登录的注意事项。用户.rc 文件是
~/.bashrc
。一个交互式登录 shell(例如控制台登录或
ssh
登录)仅读取配置文件。A非交互式登录 shell很少见,但可能会在 GUI 登录期间运行。无论哪种方式,如果这是 Bash shell,它都会充当非交互式登录 shell,并且仅读取配置文件。
一个交互式非登录 shell(例如 XTerm/Konsole 中的新选项卡)读取 rc 文件。
A非交互式非登录 shell(例如 shell 脚本)两者都不会读取,但有一个重要的例外:如果由 启动
ssh
,它会读取 rc 文件。
涉及异常的ssh
原因是,当通过 ssh ( ssh $host my_remote_script
) 运行脚本时,环境(主要是PATH
)尚未设置,就像运行本地脚本时的情况一样。因此,IMO,例外是在 中设置环境的动机~/.bashrc
,以便本地调用和远程调用的脚本使用相同的环境。
基于这一切,我的建议是:
配置文件:
- 不要设置任何可能对远程调用脚本有用的内容,包括
PATH
. - 无条件地获取 rc 文件:
. ~/.bashrc
.
- 不要设置任何可能对远程调用脚本有用的内容,包括
rc 文件:
- 根据需要设置环境变量。
请注意,当环境已设置(通过交互式非登录 shell)时,将获取该文件。因此,如果你无条件地这样做
PATH=$HOME/bin:$PATH
,你可能会PATH=$HOME/bin:$HOME/bin:...
在两次采购后得到结果(这是一个烦恼,而不是一个错误)。一个简单的解决方法是保护环境设置:# ~/.bashrc if [ ! "${MY_ENV_SET:-}" ]; then PATH=... ... export MY_ENV_SET=1 fi
仅为交互式 shell 定义 shell 细节:
... [ "$PS1" ] || return 0 PS1=<fancy_colored_prompt> source ~/.bash_alias eval $(dircolors -b ~/.dircolors) source /etc/bash_completion
图形化登录。您需要考虑的最后一件重要事情是 GUIPATH
在启动过程中如何设置。这可能可以使用 Bash 来完成,也可以不使用。就我而言,我使用 KDE,并且该文件是在启动期间获取的:
# ~/.kde/env/path.sh
# https://userbase.kde.org/Session_Environment_Variables
PATH=$(env -i /bin/bash -lc 'echo $PATH')
这会调用一个(罕见的)非交互式登录 Bash shell,使用一个空环境,该环境也源 rc 文件,并且一切都是一致的。
如果您使用另一个 GUI(Gnome?),您应该查看PATH
在启动过程中如何设置。如果您的 GUI 来源~/.profile
,请确保也从那里获取 rc 文件。