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\n
Ctrl+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 bash
bash_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 파일에서 항목을 설정해 보세요.