当前位置: 首页>>技术问答>>正文


为什么〜/.bash_profile在打开终端时没有找到源代码?

, , , , ,

问题描述

Problem

我有一台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

Questions

  1. 为什么我必须这样做?我认为bash_profile,bash_login或配置文件在没有这两个之前先在bashrc之前执行。

  2. 在这种情况下,我的终端是non-login shell 吗?

  3. 如果是这样的话,为什么在终端和终端输入密码之后进行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中通常都可以。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/386.html,未经允许,请勿转载。