问题

问题

问题

我有一台 Ubuntu 11.04 虚拟机,我想设置我的 Java 开发环境。我做了如下操作

  1. sudo apt-get install openjdk-6-jdk
  2. 添加了以下条目至的〜/ .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
    
  3. 保存更改并退出

  4. 再次打开终端并输入以下内容

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
    
  5. 什么都没有发生,就像从来没有导出过 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

问题

  1. 我为什么要这么做?我以为 bash_profile、bash_login 或 profile(如果没有这两个)会在 bashrc 之前先执行。
  2. 在这种情况下,我的终端是未登录壳?
  3. 如果是这样,为什么在终端后执行 su 并输入密码时它没有执行我已经设置了上述导出的配置文件?

答案1

~/.bash_profile仅在以登录模式启动时由 bash 提供。这通常是当您在控制台 ( Ctrl++ Alt.. ) 上登录、通过 ssh 连接或使用或以其他用户身份运行命令时。F1F6sudo -isu -

当您以图形方式登录时,~/.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 用户来说相当常见的问题。因此,请考虑:

  • 你使用bashshell,
  • 您有~/.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 (仅在图形会话中进行评估)

    为了慢速评估环境变量和反暴力主义 为您仅限用户和所有图形会话进程。它会在您登录图形用户界面时加载。

相关内容