Percorsi duplicati, problemi con .bash_profile
Sono stato indirizzato qui da Stack Overflow dopo aver pubblicato una domanda su come lottare per far funzionare PyExifTool. Sembra tuttavia che il problema fosse multiforme e essendo un principiante mi è stato detto di cercare aiuto qui.
Essenzialmente il problema si è realizzato quando mi è stato detto di correre ...
bash:~ $ type -all exiftool
che ha restituito ...
exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool
... rivelando che da qualche parte avevo dei duplicati.
Successivamente, ho corso ...
bash:~ $ echo $PATH
Che è tornato ...
/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
... che contiene duplicati e apparentemente non dovrebbe terminare con .bash_profile
Ora nel terminale, posso ripulirlo usando ...
bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')
Quanto sopra è uno snippet che ho ricevuto da Linux Journal che dovrebbe "quasi funzionare" ma il pezzo di codice che "dovrebbe funzionare" non sembra aiutarmi. L'uso del codice "quasi funzionale" fornisce quanto segue:
/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 :
Sono un principiante assoluto ma non credo che dovrebbe finire :
e chiaramente .bash_profile
è ancora presente. Tuttavia, sembra rimuovere i duplicati, anche se questo si ripristina se apro una nuova finestra di terminale, quindi è solo una soluzione alternativa acuta.
Questo è l'aspetto del mio profilo 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
Non sono sicuro che sia rilevante o correlato, ma quando avvio python dalla mia Hotbar ed eseguo ...
>>> print(os.environ['PATH'])
Stampa
/usr/bin:/bin:/usr/sbin:/sbin
Mentre quando lo avvio dal mio terminale bash usandolo IDLE3
restituisce:
/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
Informazioni periferiche e sperimentazione:
Penso di aver probabilmente incasinato qualcosa durante l'installazione di FSL, fatto qualcosa al mio .bash_profile
e ora sono perseguitato mentre cercavo di apprendere e sviluppare abilità di programmazione di base. Forse era un errore manuale o forse aveva qualcosa a che fare con homebrew o Xcode.
Potrei cancellare il .bash_profile
finale ma sono preoccupato di aver già fatto abbastanza danni e non voglio risolvere me stesso in un problema così laborioso che nessun forum Internet vuole toccarlo.
Questo è ciò che avrebbe dovuto funzionare secondo Mitch Frazier del Linux Journal . Ovviamente questa non è una riflessione su di lui o sull'articolo, ma piuttosto sulla mia comprensione limitata.
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)}'
Questo ritorna ...
/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$
Ho anche provato quanto segue (suggerito da pepa65 ) ...
bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")
Questo ritorna ...
-bash: -1: substring expression < 0
Quando provo a cercare modifiche utilizzando echo $PATH
...
Ottengo una riga vuota.
So che è improbabile che questo sia stimolante intellettualmente, quindi sono grato per qualsiasi aiuto.
MODIFICA 1:
Un ingenuo tentativo di togliere .bash_profile
dalla fine la prima riga del mio .bash_profile
non l'ha fatto sparire dal cui output è echo $PATH
rimasto immutato.
Risposte
Ecco un ridotto e corretto .bash_profile
che è assolutamente adeguato alla tua configurazione.
C'era una linea problematica all'inizio dove ~/.bash_profile
era stata erroneamente aggiunta a una linea altrimenti corretta. Tuttavia, ho rimosso l'intera riga, poiché mi sarei aspettato, e la tua diagnostica suggerisce, che stava aggiungendo una directory che era già sul valore predefinito fornito dal sistema PATH
.
Non è assolutamente necessario export PATH
più di una volta; probabilmente potresti rimuovere in sicurezza anche l'unica istanza rimanente. Il significato di export
è contrassegnare una variabile da trasformare in una variabile di ambiente visibile ai sottoprocessi. Una volta fatto ciò, i sottoprocessi avranno accesso al valore corrente della variabile, anche se il valore cambia dopo il export
. Molto probabilmente la configurazione della shell a livello di sistema lo fa già per la PATH
variabile (altrimenti non potrebbe funzionare come previsto).
Ho rimosso intere sezioni che erano state commentate; potresti naturalmente volerli riportare indietro e rimuoverli.
# 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}"
Questo file viene letto quando si avvia una nuova shell, anche se il momento esatto dipenderà anche da come il fornitore del sistema operativo ha configurato Bash. Per essere completamente sicuro che qualsiasi vecchia configurazione non interferisca più con la tua configurazione attuale, dovrai capire se è necessario disconnettersi e rientrare per ricominciare, o se puoi semplicemente avviare una nuova shell o una nuova sessione di terminale per ottenere una lavagna pulita.
Forse rivedi ancora se .bash_profile.pysave
contiene qualcosa di utile che vuoi mantenere, anche se mi aspetto che sia in linea di massima identico alla tua versione corrente, ad eccezione dell'ultima serie di righe.