问题描述
Problem
我有一台Ubuntu 11.04虚拟机,我想设置我的Java开发环境。我做了如下
-
sudo apt-get install openjdk-6-jdk
-
将以下条目添加到〜/.bash_profile
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk export PATH=$PATH:$JAVA_HOME/bin
-
保存更改并退出
-
再次打开终端并输入以下内容
echo $JAVA_HOME (blank) echo $PATH (displayed, but not the JAVA_HOME value)
-
没有任何事情发生,例如JAVA_HOME的出口和PATH的添加从未完成。
解决方案
我不得不去〜/.bashrc并在文件结尾处添加以下条目
#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile
Questions
-
为什么我必须这样做?我认为bash_profile,bash_login或配置文件在没有这两个之前先在bashrc之前执行。
-
在这种情况下,我的终端是non-login shell 吗?
-
如果是这样的话,为什么在终端和终端输入密码之后进行su操作,并没有执行上面提到的出口配置文件?
最佳解决办法
~/.bash_profile
仅在交互式登录模式下启动时才由bash提供。通常只有当您在控制台(Ctrl
+ Alt
+ F1
F6
)上登录时,或者通过ssh进行连接时才是如此。
当您以图形方式登录时,~/.profile
将由启动gnome-session的脚本(或您正在使用的任何桌面环境)专门提供。因此,当您以图形方式登录时,~/.bash_profile
完全没有来源。
当您打开一个终端时,终端将以(non-login)交互模式开始进入bash,这意味着它将输入~/.bashrc
。
放置这些环境变量的正确位置在~/.profile
中,下次登录时效果应该很明显。
从~/.bashrc
采购~/.bash_profile
是错误的解决方案。它应该是相反的方式; ~/.bash_profile
应该提供~/.bashrc
。
更详细的解释请参见DotFiles,其中包括一些历史原因。
(在附注中,通过apt安装openjdk时,应由软件包设置符号链接,以便您不需要设置JAVA_HOME
或更改PATH
)
次佳解决办法
您可以运行以下命令来检查您的Bash shell是否作为login-shell启动:
shopt login_shell
如果答复是off
,那么您没有运行登录shell。
阅读Bash手册的调用部分,了解Bash如何读取(或不读取)不同的配置文件。
摘自man bash
:
When bash is invoked as an interactive login shell, or as a non-interactive shell with the
--login
option, it first reads and executes commands from the file/etc/profile
, if that file exists. After reading that file, it looks for~/.bash_profile
,~/.bash_login
, and~/.profile
, in that order, and reads and executes commands from the first one that exists and is readable.
另一方面,su
默认情况下也不会启动登录shell,您必须通过使用--login
选项来告诉它。
第三种解决办法
我认为值得一提的是,您可以通过编辑配置文件首选项来将gnome-terminal的默认值更改为使用登录shell(即.bash -l)。
去编辑 – >配置文件首选项 – >标题和命令选项卡检查“运行命令作为登录shell”选项
第四种办法
如果您打开终端或运行su
,则不会将shell作为登录shell执行,而会作为普通的交互式shell执行。所以它读取~/.bashrc
而不是~/.bash_profile
。您可以使用-l
选项运行su
,使其运行您的shell作为登录shell。
在使用GUI时,shell通常不会作为登录shell运行,所以将所有的东西放在~/.bashrc
中通常都可以。