约定个人环境变量

约定个人环境变量

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

答案1

在哪里设置环境变量包含在设置环境变量的最佳发行版/与 shell 无关的方法是什么?

关于命名,设置环境变量的主要原因是因为应用程序使用它们,所以您无法选择名称。

环境变量没有命名空间的概念。最接近的是选择一个前缀,通常是以下形式SOMETHING_(即前缀以下划线结尾,并且有变量SOMETHING_FOO, SOMETHING_BAR, ...)。但大多数变量并不是针对特定的应用程序,而是针对一系列应用程序。如果变量仅在一个应用程序中有意义,那么它通常应该是命令行选项。所以对命名空间的需求并不大。

如果您定义的变量仅供在命令行上使用,则不要使用环境变量,请使用变量。 (看bash中环境变量和导出环境变量的区别) 如果您在 shell 脚本中定义变量并且不使用export,那么这是一个 shell 变量,而不是环境变量,并且它仅在您定义它们的 shell 中可见。因此,如果您定义一个在命令行上使用的变量:

  • 在 shell 交互式启动文件中定义它(~/.bashrc对于 bash、~/.zshrczsh、~/.config/fish/config.fishfish)。
  • 别这样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 文件。

相关内容