Bash

使用 .bash_profile 設置環境變數:只有最後一次導出才能正常工作

  • August 27, 2015

我正在嘗試使用在 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/

我實際上已經通過PATH在 python 腳本中重新設置變數來解決這個問題,但是讓我感到困擾的是我找不到發生這種情況的原因

一些資訊:

-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)

我在我的水晶球中看到您正在 Windows 機器上編輯文件。

Windows 和 Linux 有不同的方式來表示換行符。在 Linux(與任何 unix 系統一樣)上,一行由一系列字元組成,這些字元以換行符 (LF = \n= Ctrl+J) 字元結尾。在 Windows 上,行由兩個字元序列分隔:輸入,然後換行 (CRLF = \r\n= Ctrl+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 行結尾(大多數文本編輯器比記事本少腦死)。

引用自:https://unix.stackexchange.com/questions/202030