当我重新启动 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
不起作用
然后就需要进行更多的故障排除,但值得注意的是:
我听人说 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 也有点奇怪。