环境变量似乎已设置但不起作用

环境变量似乎已设置但不起作用

我使用带有 bash shell 的 Ubuntu 14.10。

我下载了一个gradle发行版并将其移动到新目录。我想永久设置一个环境变量以指向bingradle 文件夹的子目录。

我已经按照建议进行了编辑~/.bashrc~./profile包括了 gradle 运行脚本的路径。但是当我输入gradle(这是 bin 文件夹中脚本的名称)时,它并没有运行。注销、重新启动等操作后,它仍然不起作用。

这里我遗漏了什么吗?

  1. 在末尾添加了这一行.bashrc

    导出 GRADLE=/home/sanctus/Documents/Development/gradle-2.2/bin

  2. 我的~/.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:$HOME/sanctus/Documents/Development/gradle-2.2/bin"
    fi
    
    gradle="$HOME/sanctus/Documents/Development/gradle-2.2/bin"
    export gradle
    

答案1

首先,您不想这样做gradle="..."。这只会创建一个名为的变量gradle,并且是无关紧要的(除非该变量以某种方式被使用gradle但您没有这么说)。您想要做的是将包含gradle可执行文件的目录添加到系统在尝试查找要运行的程序时搜索的目录列表中。这就是变量的作用PATH

不要覆盖 的现有内容也很重要PATH。因此,要添加fooPATH,您需要执行以下操作:

PATH:"$PATH":foo

并不是

PATH="foo"

后者将删除其中的所有内容PATH,并用单独内容替换foo

因此,结合所有这些,您需要将以下几行添加到您的~/.profile(或~/.bash_profile如果存在,但不是到您的~/.bashrc):

PATH:"$PATH:$HOME/sanctus/Documents/Development/gradle-2.2/bin"

为什么是~/.profile~/.bash_profile而不是~/.bashrc?首先,因为这就是配置文件的用途。更重要的是,~/.bashrc每次启动新 shell 时都会读取。例如,每次打开新终端时。设置只需在该文件中设置一次的环境变量,会导致每次打开终端时都重置它们,这只是不必要的开销。

此外,中的设置仅影响从命令行启动的程序。如果您使用 GUI 启动某些程序(例如~/.bashrc菜单项或文件),则这些变量将不可用。.desktop

在许多系统(包括 Ubuntu)中,~/.profile当您以图形方式登录时,该文件会被读取。因此,该文件中设置的变量也将可供 GUI 程序使用。此外,~/.profile最好将这些变量设置为 ,因为该文件只会读取一次:在登录时。

此外,即使你将 shell 更改为 bash 以外的其他 shell,它仍会起作用,因为~/.profile许多最流行的 shell 都可以读取它。

重要的:如果~/.bash_profile存在,则会读取 而不是~/.profile。因此,如果您确实有这样的文件,请使用该文件。我的建议是,如果您有~/.bash_profile,请直接删除它并将其中的任何内容添加到您的标准 中~/.profile

答案2

首先你应该确保你的脚本具有执行权限:

chmod +x $HOME/sanctus/Documents/Development/gradle-2.2/bin/gradle

您可能需要使用sudo上述 chmod 来执行。

现在你错过了,当你调用时gradle你正在使用环境变量小路

PATH 是 Linux 和其他类 Unix 操作系统中的环境变量,它告诉 shell 在哪些目录中搜索可执行文件

即使您将路径添加到 $PATH 您是在 .profile 中执行的,而您必须在 中执行此操作.bashrc

那么为什么是.bashrc而不是.profile?

请看一下我的答案https://askubuntu.com/a/633820/150504

现在回到解决方案:

gedit .bashrc

添加以下行:

 export PATH=$PATH:$HOME/bin:$HOME/sanctus/Documents/Development/gradle-2.2/bin

现在保存并退出然后获取它

source .bashrc

现在测试一下。


紧急更新:

PATH="$HOME/bin:$HOME/sanctus/Documents/Development/gradle-2.2/bin"

这会扭曲您的 PATH,并且您无法使用 /bin、/usr/bin 等中的任何命令,因为这样您只需覆盖 PATH 并将其设置为两个目录 $HOME/bin 和 $HOME/sanctus/Documents/Development/gradle-2.2/bin。从您的 .profile 中删除此行。

测试它是否影响你的系统,

echo $PATH 

结果应该是(可能略有不同):

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

如果不是,你应该解决问题。将其添加到你的 .profile 中

$PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

相关内容