问题
我有一台 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
问题
- 我为什么要这么做?我以为 bash_profile、bash_login 或 profile(如果没有这两个)会在 bashrc 之前先执行。
- 在这种情况下,我的终端是未登录壳?
- 如果是这样,为什么在终端后执行 su 并输入密码时它没有执行我已经设置了上述导出的配置文件?
答案1
~/.bash_profile
仅在以登录模式启动时由 bash 提供。这通常是当您在控制台 ( Ctrl++ Alt.. ) 上登录、通过 ssh 连接或使用或以其他用户身份运行命令时。F1F6sudo -i
su -
当您以图形方式登录时,~/.profile
将由启动 gnome-session(或您正在使用的任何桌面环境)的脚本专门提供。因此,~/.bash_profile
当您以图形方式登录时,根本不提供。
当你打开一个终端时,终端会以(非登录)交互模式启动 bash,这意味着它将 source ~/.bashrc
。
放置这些环境变量的正确位置是~/.profile
,下次登录时效果就会显现出来。
~/.bash_profile
从采购~/.bashrc
是错误的解决方案。应该反过来;~/.bash_profile
应该从 采购~/.bashrc
。
看点文件以获得更彻底的解释,包括为什么会这样一些历史。
(附注:通过 apt 安装 openjdk 时,符号链接应该由包设置,因此您实际上不需要设置JAVA_HOME
或更改PATH
)
答案2
你可以通过运行以下命令来检查你的 Bash shell 是否作为登录 shell 启动:
shopt login_shell
如果答复是off
您没有运行登录 shell。
阅读 Bash 手册调用有关 Bash 如何读取(或不读取)不同配置文件的部分。
摘录自man bash
:
当 bash 作为交互式登录 shell 或使用 选项作为非交互式 shell 调用时
--login
,它首先从文件 读取并执行命令/etc/profile
(如果该文件存在)。读取该文件后,它会按顺序查找~/.bash_profile
、~/.bash_login
和~/.profile
,然后从第一个存在且可读的文件中读取并执行命令。
su
另一方面,默认情况下也不会启动登录 shell,您必须使用选项告诉它这样做--login
。
答案3
我认为值得一提的是,您可以通过编辑配置文件首选项来更改 gnome-terminal 的默认设置以使用登录 shell(即 bash -l)。
转到编辑 -> 配置文件首选项 -> 标题和命令选项卡,选中“作为登录 shell 运行命令”选项
答案4
总结
在经典推荐的 Ubuntu 设置中,~/.bash_profile
仅在特定场合进行评估。这是有道理的。
把你的东西放进去~/.bashrc
,每次它都会被评估。
好的,我想明白了,这为什么有意义?
了解正在发生的事情的关键点:
- 全部进程在 Linux 上有使用环境变量
- 环境变量是遗传
- 从而设置它们一次在父亲身上所有过程就足够了(特别是如果它需要一些计算时间。)
- 你所有进程的父亲通常是在你之后启动的 登录在您的设备上(提供您的凭证)。
- 有些事情您可能只想在您登录计算机时做一次(例如,检查新邮件……)。
因此“登录”时间通常是:
- 在控制台模式下,当您登录(使用 Ctrl-Alt F1)或通过 时
ssh
,由于 shell 将成为所有进程的父进程,因此它将加载您的~/.bash_profile
。 - 在图形模式下,当您打开会话时,第一个进程(
gnome-session
对于经典 Ubuntu)将负责读取
.profile
。
好的,那么我该把我的东西放哪儿呢?
这相当复杂,完整故事请点击这里。但这里有一个对 ubuntu 用户来说相当常见的问题。因此,请考虑:
- 你使用
bash
shell, - 您有
~/.bash_profile
并遵循推荐添加负载,~/.bashrc
以便~/.bash_profile
至少获得无论调用机制是什么,都会对一个文件进行评估。
这是关于放置物品位置的快速建议。
~/.bashrc (得到在所有场合进行评估(只要您遵循建议)
为了快速评估环境变量和代码 仅限用户和仅限 bash命令行使用(例如别名)。巴什主义受欢迎的。
它会在以下情况下自行加载:
- 在图形会话中创建一个新的 shell 窗口/窗格。
- 呼叫
bash
screen
新窗格或选项卡。 (不是tmux
!)- 图形控制台客户端中的任何 bash 实例 (
terminator
/gnome-terminal
...) 如果你不要勾选 选项“作为登录 shell 运行命令”。
并且由于之前的建议,它将在所有其他场合被加载。
的〜/ .bash_profile (得到仅在特定场合评估)
为了慢速评估环境变量和代码仅限用户和控制台会话流程。 巴什主义欢迎。它加载于:
- 控制台登录(Ctrl-Alt F1),
- ssh 登录到这台机器,
tmux
新窗格或窗口(默认设置),(不是screen
!)- 明确调用
bash -l
, - 图形控制台客户端中的任何 bash 实例 (
terminator
/gnome-terminal
...)除非您勾选选项“以登录 shell 身份运行命令”。
〜/ .profile (仅在图形会话中进行评估)
为了慢速评估环境变量和反暴力主义 为您仅限用户和所有图形会话进程。它会在您登录图形用户界面时加载。