web-dev-qa-db-ja.com

.bash_profileを使用した環境変数の設定:最後のエクスポートのみが正しく機能します

.bash_profileを使用してUnixでいくつかの環境変数をエクスポートしようとしています

これは次のようになります。

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/

そして、もう一度theanoをpythonからインポートしてみてください。このエラーが発生します:

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が機能しなかったことを示しています。以前と同じ手順を実行し、exit python最初の行を再実行すると、正しくインポートされます。

最初のエクスポートをbashスクリプトの最後の行に追加すると(2回エクスポート)、この最初/ 3番目のエクスポートは正常に機能しますが、2番目は機能しません。つまり、最後のエクスポートのみが正しく機能します。

変数に対してエコーコマンドを実行しようとしましたが、正しく設定されているかのように正常に出力されていましたが、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/

pythonスクリプト内でPATH変数を再設定することでこの問題を実際に解決しましたが、これが発生している理由が見つからないのが気になります

いくつかの情報:

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

クリスタルボールで、Windowsマシンでファイルを編集していることがわかります。

WindowsとLinuxでは、改行を表す方法が異なります。 Linux(他のUNIXシステムと同様)では、行は改行(LF = \n = Ctrl + J)文字で終わる一連の文字で構成されます。 Windowsでは、行は2文字のシーケンスで区切られます。キャリッジリターン、ラインフィード(CRLF = \r\n = Ctrl + M Ctrl + J)です。

ファイルには、export PATH=…コマンド、次にCR、LF、およびexport LD_LIBRARY_PATHコマンドが含まれており、末尾に改行はありません。 Linuxプログラムの場合、同じバイトシーケンスはexport PATH=…を表し、末尾にCR文字があり、次に改行、次にexport PATH=…を含む未完成の行が続きます。シェルは最初のコマンドを忠実に実行します。このコマンドは、名前がCR文字で終わるディレクトリをPATHに追加します。その名前のディレクトリがないため、PATHを変更しても効果はありません。次に、シェルは部分的な行を完全な行であるかのように扱います。これは、LD_LIBRARY_PATHを設定するための意図されたコマンドです。

2回目にディレクトリを追加したときは、コマンドにCR文字を入力しなかったため、コマンドは機能しました。出力を表示すると、CR文字は端末によって「行の先頭に戻る」ことを意味すると解釈されました。 CR文字の前後でまったく同じコンテンツがあったため、そのコンテンツは1回印刷されたように見えました。実際、同じ位置で2回印刷されました。

LinuxでLinux構成ファイルを編集するか、WindowsエディターにLinuxの行末を使用するように指示します(メモ帳よりも頭がおかしくないほとんどのテキストエディターで実行できます)。

違いがbash_profileとbashrcで説明されているman bashセクションのファイルをご覧ください。

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

新しいシェルを開始していて、〜/ .bash_profileに入力したエントリがまったく使用されていないようです。

代わりに、〜/ .bash_rcファイルのエントリを設定してみてください。

0
Lambert