중복 경로, .bash_profile 관련 문제

Aug 16 2020

PyExifTool이 작동하도록 고군분투 하는 것에 대한 질문 을 게시 한 후 Stack Overflow에서 여기로 안내되었습니다. 그러나 문제는 다방면에 있었고 초보자이기 때문에 여기에서 도움을 요청하라는 지시를 받았습니다.

본질적으로 문제는 내가 실행하라는 지시를 받았을 때 실현되었습니다.

bash:~ $ type -all exiftool

돌아온 ...

exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool

... 어딘가에 중복 항목이 있음을 드러냅니다.

그 후 나는 달렸다 ...

bash:~ $ echo $PATH

돌아온 ...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

... 중복을 포함하며 분명히 다음으로 끝나서는 안됩니다. .bash_profile

이제 터미널에서 다음을 사용하여 정리할 수 있습니다.

bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')

위의 내용은 Linux Journal 에서 가져온 '거의 작동'으로되어 있지만 '작동해야하는'코드는 도움이되지 않는 것 같습니다. '거의 기능'코드를 사용하면 다음이 제공됩니다.

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile :

나는 완전히 초심자이지만 그것이 끝나야한다고 생각하지 않으며 :분명히 .bash_profile여전히 존재합니다. 그러나 중복을 제거하는 것처럼 보이지만 새 터미널 창을 열면 재설정되므로 심각한 해결 방법 일뿐입니다.

이것은 내 bash 프로필의 모습입니다.

export PATH=/usr/local/bin:$PATH~/.bash_profile # Setting PATH for Python 3.6 # The original version is saved in .bash_profile.pysave #PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
#export PATH

# Setting PATH for Python 2.7
# The original version is saved in .bash_profile.pysave
#PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}" #export PATH # FSL Setup FSLDIR=/usr/local/fsl PATH=${FSLDIR}/bin:${PATH} export FSLDIR PATH . ${FSLDIR}/etc/fslconf/fsl.sh


# Setting PATH for Python 3.8
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
export PATH

이것이 관련이 있는지 또는 관련이 있는지 확실하지 않지만 Hotbar에서 Python을 시작하고 실행할 때 ...

>>> print(os.environ['PATH'])

그것은 인쇄

/usr/bin:/bin:/usr/sbin:/sbin

bash 터미널에서 실행하면 IDLE3다음이 반환됩니다.

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

주변 정보 및 실험 :

나는 아마도 FSL을 설치할 때 뭔가를 엉망으로 만들었고, .bash_profile나에게 무언가를 했고, 이제 기본적인 코딩 기술을 배우고 개발하려고 노력하는 동안 유령에 빠지고 있다고 생각 합니다. 수동 오류이거나 homebrew 또는 Xcode와 관련이있을 수 있습니다.

.bash_profile엔딩을 삭제할 수는 있지만 이미 충분한 피해를 입었으므로 문제를 해결하고 싶지 않아서 인터넷 포럼이 손 대고 싶지 않을 정도로 힘들다.

이것은 Linux Journal의 Mitch Frazier 에 따르면 작동하도록되어있는 것 입니다. 분명히 이것은 그나 기사에 대한 반성이 아니라 오히려 나의 제한된 이해에 대한 것입니다.

bash:~ $ export PATH=/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile
bash:~ $ echo -n $PATH | awk -v RS=: '!($0 in a) {a[$0]; printf("%s%s", length(a) > 1 ? ":" : "", $0)}'

이것은 반환 ...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profileUser's-MBP:~ username$

나는 또한 다음을 시도했습니다 ( pepa65 제안 ) ...

bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")

이것은 반환 ...

-bash:  -1: substring expression < 0

변경 사항을 찾으려고 할 때 echo $PATH...

빈 줄이 나타납니다.

나는 이것이 지적으로 자극적이지 않을 것임을 알고 있으므로 도움을 주셔서 감사합니다.

편집 1 :

.bash_profile내 첫 번째 줄의 끝에서 제거하려는 순진한 시도 는 변경되지 않은 .bash_profile출력에서 사라지지 echo $PATH않았습니다.

답변

tripleee Aug 16 2020 at 14:21

다음은 .bash_profile구성에 적합하게 축소 및 수정 된 것입니다.

처음에는 ~/.bash_profile다른 올바른 줄에 잘못 추가 된 문제가있는 줄이 있었습니다. 그러나 예상하고 진단 결과 이미 시스템 제공 기본값에 있던 디렉토리를 추가하고 있다고 예상했기 때문에 전체 줄을 제거했습니다 PATH.

export PATH두 번 이상 필요하지 않습니다 . 나머지 하나의 인스턴스도 안전하게 제거 할 수 있습니다. 의 의미는 하위 프로세스에서 볼 수 export있는 환경 변수 로 만들 변수를 표시하는 것 입니다. 이 작업을 완료하면 하위 프로세스는 .NET Framework 이후에 값이 변경 되더라도 변수의 현재 값에 액세스 할 수 있습니다 export. 아마도 시스템 전체의 쉘 구성이 이미 PATH변수에 대해이 작업을 수행 할 것입니다 (그렇지 않으면 의도 한대로 작동하지 않을 수 있음).

주석 처리 된 전체 섹션을 제거했습니다. 물론 다시 가져와 주석 처리를 제거 할 수 있습니다.

# FSL Setup
FSLDIR=/usr/local/fsl
PATH=${FSLDIR}/bin:${PATH}
export FSLDIR PATH
. ${FSLDIR}/etc/fslconf/fsl.sh # Setting PATH for Python 3.8 # The original version is saved in .bash_profile.pysave PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"

이 파일은 새 셸을 시작할 때 읽혀 지지만 OS 공급 업체가 Bash를 구성한 방법에 따라 정확히 언제 달라질 수 있습니다. 이전 구성이 더 이상 현재 구성을 방해하지 않는지 확인하려면 다시 시작하는 데 로그 아웃했다가 다시 로그인해야하는지 또는 새 셸 또는 새 터미널 세션을 시작하여 깨끗한 슬레이트를 얻으십시오.

.bash_profile.pysave유지하고 싶은 유용한 내용이 포함되어 있는지 여전히 검토 할 수 있지만, 마지막 줄 집합을 제외하고는 현재 버전과 대체로 동일 할 것으로 예상합니다.