Bash

重複路徑,.bash_profile 問題

  • August 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現在在嘗試學習和發展基本編碼技能時被困擾。可能是手動錯誤,也可能與自製軟體或 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包含您想要保留的有用內容,儘管我希望它與您目前的版本大致相同,除了最後一組行。

引用自:https://unix.stackexchange.com/questions/604764