.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 스크립트의 마지막 줄에 첫 번째 내보내기를 추가하면(두 번 내보내기) 첫 번째/세 번째 내보내기는 제대로 작동하지만 두 번째 내보내기는 제대로 작동하지 않습니다. 즉, 마지막 내보내기만 제대로 작동합니다.

변수를 에코하려고 시도했는데 올바르게 설정된 것처럼 잘 인쇄되지만 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)

답변1

내 수정구에는 당신이 Windows 컴퓨터에서 파일을 편집하고 있는 것이 보입니다.

Windows와 Linux에는 개행 문자를 표현하는 방법이 다릅니다. Linux(모든 UNIX 시스템과 마찬가지로)에서 행은 \n개행 문자(LF == Ctrl+J)로 끝나는 일련의 문자로 구성됩니다. Windows에서 줄은 캐리지 리턴과 줄 바꿈(CRLF == \r\nCtrl+M Ctrl+J) 이라는 두 문자의 순서로 구분됩니다 .

파일에는 export PATH=…명령, CR, LF 및 export LD_LIBRARY_PATH끝에 줄바꿈이 없는 명령이 포함되어 있습니다. Linux 프로그램의 경우 동일한 바이트 시퀀스는 export PATH=…끝에 CR 문자, 개행 문자, 포함된 미완성 행을 의미합니다 export PATH=…. 쉘은 PATH이름이 CR 문자로 끝나는 디렉토리를 추가하는 첫 번째 명령을 충실히 실행합니다 . 해당 이름을 가진 디렉터리가 없으므로 변경 사항이 PATH적용되지 않습니다. 그러면 쉘은 부분 행을 완전한 행으로 처리합니다. 이는 set 에 대해 예상되는 명령입니다 LD_LIBRARY_PATH.

두 번째로 디렉터리를 추가하는 경우 명령에 CR 문자를 입력하지 않으므로 명령이 작동합니다. 출력을 표시하면 터미널은 CR 문자를 "줄의 시작 부분으로 다시 이동"으로 해석합니다. CR 문자 전후의 내용이 정확히 동일하므로 내용이 한 번 인쇄된 것처럼 보이지만 실제로는 같은 위치에 두 번 인쇄됩니다.

Linux에서 Linux 구성 파일을 편집하거나 Windows 편집기에 Linux 줄 끝을 사용하도록 지시합니다(메모장보다 덜 두뇌적인 대부분의 텍스트 편집기에서 이 작업을 수행할 수 있습니다).

답변2

man bashbash_profile과 bashrc의 차이점을 설명하는 FILES 섹션을 참조하세요 .

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

새 쉘을 시작하고 ~/.bash_profile에 넣은 항목이 전혀 사용되지 않는 것 같습니다.

대신 ~/.bash_rc 파일에서 항목을 설정해 보세요.

관련 정보