如何设置环境而不是每次都自己采购.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 

我将不胜感激任何回应。

TL; DR:export命令放在.profile ,删除或重命名.bash_profile ,然后注销并重新登录以应用更改。

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

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

当作为登录shell调用时 ,大多数Bourne样式的shell也将源.profile 这包括bash,除非.profile仅在.bash_profile.bash_login不存在时才被获取。 如果存在.bash_profile ,则会使用它; 否则,如果.bash_login存在,它将被使用; 否则,使用.profile

这样做的原因是,不依赖于shell的命令,你想要在登录时运行的命令,可以进入.profile ,如果有特定于bash的命令,你可以把它们放在其中一个命令中。其他两个文件。 通常,您将从.bash_profile.bash_login .profile

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

缺少.bash_profile提供的.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 

您可以简单地将所有11行代码(如果不计算空白行和注释,则为6行)添加到.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 For Something Else(但你可能没有)

我应该注意到我推荐的内容与之前所说的c0rp非常类似(在对已被删除的post 的评论中 ):

将所有变量放在~/.profile ,并从~/.bash_profile ~/.profile~/.profile 在启动过程桌面会话期间由DisplayManager自动执行,并且当从文本控制台登录时由登录shell执行 。

但是我的建议在一个重要方面有所不同:因为在我看来你根本不需要.bash_profile文件,我建议你把它移开(即删除或重命名),而不用担心采购它在.profile

如果由于某种原因需要.bash_profile文件 ,那么你仍然应该避免使用环境变量定义(因为它们只适用于bash登录,而不适用于你的图形登录)。

如果你有必须放在.bash_profile文件中的特定于.bash_profile命令,那么c0rp表示你可以将这一行放在.bash_profile文件中:

 . $HOME/.profile 

然后.bash_profile将获取.profile并且.profile的命令将针对bash和非bash登录运行。

如果使用.profile不起作用

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

  • 一些显示管理器默认使用.profile ; 有些人显然没有。
  • 这也可能取决于桌面环境 (我的意思是,在告知DM如何启动图形会话的per-DE会话配置文件中)。

我听说有人说LightDM没有源代码.profile , 我认为这至少是因为它包装在一些操作系统中 。 我不能绝对谈论这个问题,但在Ubuntu系统中我使用LightDM作为显示管理器, .profile来源于图形会话,而.profile变量导出是有效的。

(在其他操作系统上,我并不总是这样,比如Debian。)

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

如果您愿意在变量定义中有一些冗余,可以使用.pam_environment作为快速替代方案。

man pam_env解释说,可以将环境变量定义为envfiles中的KEY=VAL对。 正如该手册页所述,默认的系统范围envfile是/etc/environment ,默认的每用户envfiles是~/.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定义和导出您的环境变量,如上所述。

EnvironmentVariables文章声称可以修改环境变量的值,甚至可以在.pam_environment包含其他环境变量的.pam_environment ,其语法如PATH DEFAULT=${PATH}:${HOME}/MyPrograms 然而,这似乎与(更多)官方文档完全不一致,我在多台机器上尝试过但没有成功,我也只听说过其他人也失败了。 我强烈怀疑维基作者将pam_env“envfile”语法与pam_env“conffile”语法混淆(使用man pam_env使用的术语)。 希望有一天有人会找到肯定的,然后可以编辑维基(要么更正或澄清)。

为什么.bash_profile在OS X中适用.bash_profile

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

由于Terminal.app直接启动OS X上的每个bash实例(除非你重新配置了东西)充当登录shell,否则.bash_profile会被获取。

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

.bash_profile中,OS X和Ubuntu之间的关键区别在于:

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

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

    如果没有类似登录的话,启动登录shell也有点奇怪。