如何设置环境而无需每次自己获取 .bash_profile?

如何设置环境而无需每次自己获取 .bash_profile?

当我重新启动 Ubuntu 14.04 时,环境变量被设置回默认值,source .bash_profile每次我都必须运行,这非常烦人。我通常将环境变量保存在.bash_profile主目录中,即/home/buraktas。这是文件文本:

### export JAVA_HOME variable
export JAVA_HOME=/usr/local/dev/jdk1.8.0_20
export PATH=$PATH:$JAVA_HOME/bin

### export M2_HOME
export M2_HOME=/usr/local/dev/maven
export PATH=$PATH:$M2_HOME/bin

### export SCALA_HOME
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$SCALA_HOME/bin

我将非常感激任何形式的回复。

答案1

总结:输入您的export命令.profile,删除或重命名.bash_profile,然后注销并重新登录以应用您的更改。

如何使用每个用户的“配置文件”

默认情况下,大多数桌面环境都配置为.profile当您以图形方式登录时,您的主目录中的文件将被获取。听起来您正在使用 Ubuntu 的默认桌面环境,即带有 Unity 的 GNOME。这应该可以。

最多伯恩风格的贝壳还将.profile来源当被调用为登录外壳这包括 bash,但.profile只有当.bash_profile.bash_login不存在时.bash_profile才会使用。如果存在,则使用;否则,如果.bash_login存在,则使用;否则,.profile使用。

这样做的原因是,那些不依赖于 shell 是否为 bash 的命令(您希望在登录时运行)可以放在 中,如果有 bash 特定的命令,您可以将它们放在另外两个文件之一中。通常,您会从或中.profile获取源代码。.profile.bash_profile.bash_login

如果 中仅有的命令.bash_profile就是您在问题中显示的命令,那么您.bash_profile根本不需要使用,因为这些命令可以在 Bourne 风格的 shell 之间移植。然后您可以删除.bash_profile(或将其重命名为类似.bash_profile.old)并将这些命令放入 中.profile。它们可以放在该文件的最底部,如果您愿意,您可以先备份它(备份的合理名称可能是.profile.old.profile.orig,但您可以随意命名备份,因为它实际上并没有被使用)。

缺少.bash_profile--provided.bash_login也不存在--将导致.profile被使用。(.profile可能已经被用于您的图形登录。)

该怎么办

移除或重命名.bash_profile

编辑.profile。它通常看起来像这样:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

您只需将所有十一行代码(如果不算空行和注释,则为六行)添加到底部.profile,保存文件,然后注销并重新登录。

可选:你可以考虑重写这些作业

虽然这完全是可选的,但你可能想借此机会重构您的export陈述。目前您使用:

### export JAVA_HOME variable
export JAVA_HOME=/usr/local/dev/jdk1.8.0_20
export PATH=$PATH:$JAVA_HOME/bin

### export M2_HOME
export M2_HOME=/usr/local/dev/maven
export PATH=$PATH:$M2_HOME/bin

### export SCALA_HOME
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$SCALA_HOME/bin

PATH被修改了三次,每次修改其他被赋值变量。这没问题,可能就是你想要的。但它比这个替代方案更长,而且(在我看来)更不具有自文档性:

# export Java, Maven, and Scala homes and add their bins to PATH
export JAVA_HOME=/usr/local/dev/jdk1.8.0_20
export M2_HOME=/usr/local/dev/maven
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin:$SCALA_HOME/bin

如果你需要.bash_profile其他东西(但你可能不需要)

我应该指出的是,我所推荐的与c0rp之前说过(在一条评论一个帖子现已被删除):

将所有变量放入~/.profile,并将来源~/.profile置于~/.bash_profile~/.profile 在启动过程桌面会话期间由 DisplayManager 自动执行,以及由登录外壳当从文本控制台登录时

但我的建议在一个重要方面有所不同:因为在我看来您根本不需要某个.bash_profile文件,所以我建议您将其移开(即删除或重命名它),而不要费心在 中获取它.profile

如果你出于某种原因需要.bash_profile文件,那么您仍然应该避免在其中包含环境变量定义(因为它们仅适用于狂欢登录名,而不是图形登录名)。

如果您有必须放在.bash_profile文件中的特定于 bash 的命令,那么正如 c0rp 所说,您可以将此行放在.bash_profile文件中:

. $HOME/.profile

然后.bash_profile将源.profile和中的命令.profile将针对 bash 和非 bash 登录运行。

如果使用.profile不起作用

然后就需要进行更多的故障排除,但值得注意的是:

  • 一些显示管理器默认来源.profile;有些显然没有。
  • 这也可能取决于桌面环境(我的意思是,每个 DE 会话配置文件都会告诉 DM 如何启动图形会话)。

我听人说 LightDM 没有源代码.profile,而且我认为这是真的,至少因为它被打包在某些操作系统中我无法完全说明这个问题,但在我使用 LightDM 作为显示管理器的 Ubuntu 系统中,.profile 源自图形会话和变量导出的资料.profile都是有效的。

(对于我来说,它在其他操作系统上并不总是能正常工作,例如 Debian。)

如果使用.profile不起作用:一个快速而肮脏的替代方案

如果您愿意在变量定义中保留一些冗余,则可以使用它.pam_environment作为一种快速替代方法。

man pam_env解释了人们可以在 envfile 中将环境变量定义为KEY=VAL对。正如该手册页所解释的那样,默认的系统范围 envfile 是 ,/etc/environment而默认的每个用户 envfile 是~/.pam_environment

因此,您可以.pam_environment在主目录中创建一个文件并在其中放入如下内容:

JAVA_HOME="/usr/local/dev/jdk1.8.0_20"
M2_HOME="/usr/local/dev/maven"
SCALA_HOME="/usr/local/dev/scala-2.11.2"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/dev/jdk1.8.0_20/bin:/usr/local/dev/maven/bin:/usr/local/dev/scala-2.11.2/bin"

如你所见,任何改变都需要你做多次修改,而且这种高水平的重复也使得阅读和理解变得困难。这就是为什么我一开始不推荐这种方式。

.profile在您的情况下,最简单和最自记录的方式是按照上述方法定义和导出您的环境变量。

环境变量文章声称这是可能的修改环境变量的值,甚至包括其他环境变量的扩展,.pam_environment语法如下PATH DEFAULT=${PATH}:${HOME}/MyPrograms。然而,这似乎与(更多)官方文档,我在多台机器上尝试过,但没有成功,而且我只听说过其他机器也失败了。我强烈怀疑 wiki 作者混淆了 pam_env “envfile” 语法和pam_env“conffile”语法(使用man pam_env)。希望有一天,有人能抽出时间去确认,然后可以编辑 wiki(无论是为了更正还是澄清)。

为什么.bash_profile在 OS X 中可以这样做

OS X 是少数几个环境/系统之一,其默认图形桌面(即 Terminal.app 实例)上的终端默认配置是将 shell 作为登录 shell 而不是非登录 shell 启动。(赛格威是另一个。)

由于 OS X 上的每个由 Terminal.app 直接启动的 bash 实例(除非您重新配置了某些内容)都充当登录 shell,因此.bash_profile会获取来源。

我怀疑,在通过 Terminal.app(或非图形登录,例如 SSH 会话)访问的环境之外,导出功能.bash_profile也不适用。

OS X 和 Ubuntu 之间的主要区别在于.bash_profile

  • 在 OS X 中,Terminal.app 启动的 shell 是作为登录 shell 启动的。由于 bash 是 OS X 中的默认交互式 shell(自 OS X 10.3 或更高版本以来),因此.bash_profile如果存在则将其作为源。

  • 在 Ubuntu 中,当您在图形会话中运行 GNOME 终端(或其他 GUI 终端仿真器)时,启动的 shell 通常不是登录 shell。登录 shell 执行的任务通常已经执行(通常由显示管理器执行)以设置图形会话,因此无需再次执行它们。

    当没有进行任何类似登录的操作时启动登录 shell 也有点奇怪。

相关内容