重複路徑,.bash_profile 問題
在發布了一個關於努力讓 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
現在在嘗試學習和發展基本編碼技能時被困擾。可能是手動錯誤,也可能與自製軟體或 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
從 my 的第一行末尾刪除的天真嘗試.bash_profile
並沒有使它從echo $PATH
保持不變的輸出中消失。
這是一個減少和更正
.bash_profile
的內容,希望它適合您的配置。一開始有一條有問題的行
~/.bash_profile
被錯誤地添加到其他正確的行中。但是,我刪除了整行,因為我希望並且您的診斷表明它正在添加一個目錄,該目錄已經在系統提供的 default 上PATH
。絕對沒有必要
export PATH
不止一次;也許您甚至可以安全地刪除剩餘的一個實例。的含義export
是將變數標記為對子程序可見的環境變數。完成此操作後,子流程將可以訪問變數的目前值,即使在export
. 很可能您的系統範圍的 shell 配置已經為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}"
當你啟動一個新的 shell 時會讀取這個文件,不過具體時間也取決於你的作業系統供應商如何配置 Bash。為了完全確保任何舊配置不再乾擾您目前的配置,您必須弄清楚是否需要註銷並重新登錄才能重新開始,或者您是否可以簡單地啟動一個新的 shell 或一個新的終端會話來得到一張白紙。
也許仍然檢查是否
.bash_profile.pysave
包含您想要保留的有用內容,儘管我希望它與您目前的版本大致相同,除了最後一組行。