使用 .bash_profile 设置环境变量:只有最后一次导出才能正常工作

使用 .bash_profile 设置环境变量:只有最后一次导出才能正常工作

我正在尝试使用 Unix 导出一些环境变量.bash_profile

现在读起来是这样的:

export PATH=${PATH}:/usr/local/cuda-6.0/bin/
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/

之后我尝试运行一个使用这些变量的 python 脚本

python
>>> import theano

我收到此错误:

ERROR (theano.sandbox.cuda): nvcc compiler not found on $PATH. Check your nvcc installation and try again.

然后我退出 python,手动重新运行第一行.bash_profile,它就可以工作了。

如果我像这样更改导出的顺序:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
export PATH=${PATH}:/usr/local/cuda-6.0/bin/

并再尝试一次从 python 导入 theano 我收到此错误:

ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: libcublas.so.6.0: cannot open shared object file: No such file or directory
WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not available  (error: cuda unavilable)

这表明导出LD_LIBRARY_PATH不起作用。我执行与之前相同的过程,退出 python 重新运行第一行,然后正确导入。

将第一个导出添加到 bash 脚本的最后一行(导出两次)使得第一个/第三个导出工作正常,但第二个则不行,也就是说,只有最后一个导出工作正常。

我尝试对变量执行 echo 命令,并且它正常打印,就好像它们已正确设置一样,但我无法将它们与 python 一起使用。此外,当手动重新设置它们时,不会重复导出它们,但重新设置会:

-bash-4.2$ echo $LD_LIBRARY_PATH
:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ echo $LD_LIBRARY_PATH
:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ echo $LD_LIBRARY_PATH
:/usr/local/cuda-6.0/targets/x86_64-linux/lib/:/usr/local/cuda-6.0/targets/x86_64-linux/lib/

我实际上已经通过重新设置PATHpython 脚本中的变量解决了这个问题,但令我困扰的是我找不到发生这种情况的原因

一些信息:

-bash-4.2$ bash --version
GNU bash, version 4.2.53(1)-release (x86_64-redhat-linux-gnu)
-bash-4.2$ cat /etc/*-release
Fedora release 19 (Schrödinger’s Cat)

答案1

我在水晶球中看到您正在 Windows 计算机上编辑文件。

Windows 和 Linux 有不同的表示换行符的方式。在 Linux(与任何 UNIX 系统一样)上,一行由一系列以换行符 (LF == \nCtrl+J) 结尾的字符组成。在 Windows 上,行由两个字符序列分隔:回车符,然后换行符 (CRLF == \r\nCtrl+M Ctrl+J)。

您的文件包含export PATH=…命令,然后是 CR、LF 和export LD_LIBRARY_PATH末尾没有换行符的命令。对于 Linux 程序,相同的字节序列表示export PATH=…末尾有一个 CR 字符,然后是换行符,然后是包含 的未完成行export PATH=…。您的 shell 忠实地执行第一个命令,该命令添加一个目录,其PATH名称以 CR 字符结尾。由于没有该名称的目录,因此 的更改PATH无效。然后 shell 将部分行视为完整行,这是 set 的预期命令LD_LIBRARY_PATH

当您第二次追加目录时,您没有在命令中键入 CR 字符,因此该命令有效。当您显示输出时,终端将 CR 字符解释为“移回行首”。由于 CR 字符之前和之后的内容完全相同,因此似乎将该内容打印一次 - 事实上它在同一位置打印了两次。

在 Linux 下编辑 Linux 配置文件,或者告诉 Windows 编辑器使用 Linux 行结尾(大多数比记事本不那么脑残的文本编辑器都可以做到这一点)。

答案2

请查看man bashFILES 部分,其中解释了 bash_profile 和 bashrc 的差异:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

看起来您正在启动一个新的 shell,并且您放入 ~/.bash_profile 中的条目根本没有被使用。

尝试改为设置 ~/.bash_rc 文件中的条目。

相关内容