约定个人环境变量

kal*_*gne 5 bash environment-variables

Unix设置个人环境变量有约定吗?我读到它们应该被放入$HOME/.bash_profile而不是$HOME/.bashrc. 尽管如此,我正在考虑提供一种方法来区分我自己的变量。这样即使我忘记了,我也能一眼看出它是否是我设置的。例如,当我在终端中进行自动完成时,我可以使我的变量以下划线或减号“m”开头,就像C++语言约定之一一样。我知道可能没有绝对的答案,但我想听听一些有助于实现此目的的良好实践和约定:提供一种简单的方法来区分系统环境变量和个人环境变量。

Mat*_*vid 0

以下是我对在何处设置环境的建议以及解释。

相关详情如下:

  • 用户配置文件~/.bash_profile~/.bash_login、 或~/.profile。我建议使用前两个之一,因为最后一个与其他外壳重叠。不过,请参阅最后有关 GUI 登录的注意事项。

  • 用户rc文件~/.bashrc.

  • 交互式登录外壳(例如控制台登录或ssh登录)仅读取配置文件。

  • 非交互式登录 shell很少见,但它可能会在 GUI 登录期间运行。无论哪种方式,如果这是 Bash shell,它都会充当非交互式登录 shell,并且仅读取配置文件。

  • 交互式非登录 shell(例如 XTerm/Konsole 中的新选项卡)读取 rc 文件。

  • 非交互式非登录 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
      
      Run Code Online (Sandbox Code Playgroud)
    • 仅为交互式 shell 定义 shell 细节:

      ...
      [ "$PS1" ] || return 0
      PS1=<fancy_colored_prompt>
      source ~/.bash_alias
      eval $(dircolors -b ~/.dircolors)
      source /etc/bash_completion
      
      Run Code Online (Sandbox Code Playgroud)

图形用户界面登录。您需要考虑的最后一件重要事情是 GUIPATH在启动过程中如何设置。这可以使用 Bash 来完成,也可以不使用。就我而言,我使用 KDE,并且该文件是在启动期间获取的:

# ~/.kde/env/path.sh
# https://userbase.kde.org/Session_Environment_Variables
PATH=$(env -i /bin/bash -lc 'echo $PATH')
Run Code Online (Sandbox Code Playgroud)

这会调用一个(罕见的)非交互式登录 Bash shell,使用一个空环境,该环境也源 rc 文件,并且一切都是一致的。

如果您使用另一个 GUI(Gnome?),您应该查看PATH在启动过程中如何设置。如果您的 GUI 来源~/.profile,请确保也从那里获取 rc 文件。