Doppelte Pfade, Probleme mit .bash_profile
Ich wurde von Stack Overflow hierher geleitet, nachdem ich eine Frage zum Kampf um die Funktionsfähigkeit von PyExifTool gestellt hatte. Es scheint jedoch, dass das Problem vielfältig war und ich als Neuling aufgefordert wurde, hier Hilfe zu suchen.
Im Wesentlichen wurde das Problem erkannt, als mir gesagt wurde, ich solle rennen ...
bash:~ $ type -all exiftool
was zurückkehrte ...
exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool
... enthüllt, dass ich irgendwo Duplikate hatte.
Anschließend lief ich ...
bash:~ $ echo $PATH
Welches kehrte zurück ...
/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
... die Duplikate enthält und anscheinend nicht mit enden sollte .bash_profile
Jetzt im Terminal kann ich das mit ...
bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')
Das Obige ist ein Ausschnitt aus dem Linux Journal , der "fast funktionieren" soll, aber der Code, der "funktionieren sollte", scheint mir nicht zu helfen. Die Verwendung des "fast funktionsfähigen" Codes ergibt Folgendes:
/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 :
Ich bin ein absoluter Neuling, aber ich glaube nicht, dass es enden soll :
und das .bash_profile
ist eindeutig immer noch vorhanden. Es scheint jedoch Duplikate zu entfernen, obwohl dies zurückgesetzt wird, wenn ich ein neues Terminalfenster öffne, sodass es nur eine akute Problemumgehung ist.
So sieht mein Bash-Profil aus:
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
Ich bin nicht sicher, ob dies relevant oder verwandt ist, aber wenn ich Python von meiner Hotbar aus starte und ...
>>> print(os.environ['PATH'])
Es wird gedruckt
/usr/bin:/bin:/usr/sbin:/sbin
Wenn ich es von meinem Bash-Terminal aus starte, IDLE3
wird Folgendes zurückgegeben:
/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
Periphere Informationen & Experimente:
Ich glaube, ich habe bei der Installation von FSL wahrscheinlich etwas durcheinander gebracht, etwas mit mir gemacht .bash_profile
und werde jetzt verfolgt, während ich versuche, grundlegende Codierungsfähigkeiten zu erlernen und zu entwickeln. Vielleicht war es ein manueller Fehler oder vielleicht hatte es etwas mit Homebrew oder Xcode zu tun.
Ich könnte das .bash_profile
Ende löschen , aber ich befürchte, dass ich bereits genug Schaden angerichtet habe und mich nicht in ein Problem einmischen möchte, das so mühsam ist, dass kein Internetforum es berühren möchte.
Dies sollte laut Mitch Frazier vom Linux Journal funktionieren . Offensichtlich ist dies keine Reflexion über ihn oder den Artikel, sondern über mein begrenztes Verständnis.
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)}'
Dies kehrt zurück ...
/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$
Ich habe auch folgendes versucht (vorgeschlagen von pepa65 ) ...
bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")
Dies kehrt zurück ...
-bash: -1: substring expression < 0
Wenn ich versuche, mit echo $PATH
... nach Änderungen zu suchen
Ich bekomme eine leere Zeile.
Ich weiß, dass dies wahrscheinlich nicht intellektuell anregend ist, deshalb bin ich für jede Hilfe dankbar.
EDIT 1:
Ein naiver Versuch, .bash_profile
das Ende der ersten Zeile von mir zu entfernen .bash_profile
, ließ es nicht verschwinden, dessen Ausgabe echo $PATH
unverändert blieb.
Antworten
Hier ist eine reduzierte und korrigierte, .bash_profile
die hoffentlich für Ihre Konfiguration angemessen ist.
Am Anfang gab es eine problematische Zeile, in der ~/.bash_profile
fälschlicherweise eine ansonsten korrekte Zeile hinzugefügt wurde. Ich habe jedoch die gesamte Zeile entfernt, da ich dies erwarten würde, und Ihre Diagnose legt nahe, dass ein Verzeichnis hinzugefügt wurde, das sich bereits in der vom System bereitgestellten Standardeinstellung befand PATH
.
Es besteht definitiv keine Notwendigkeit, export PATH
mehr als einmal; Wahrscheinlich könnten Sie sogar die eine verbleibende Instanz sicher entfernen. Die Bedeutung von export
besteht darin, eine Variable zu markieren, die in eine Umgebungsvariable umgewandelt werden soll, die für Unterprozesse sichtbar ist. Sobald Sie dies getan haben, haben Unterprozesse Zugriff auf den aktuellen Wert der Variablen, auch wenn sich der Wert nach dem ändert export
. Wahrscheinlich macht Ihre systemweite Shell-Konfiguration dies bereits für die PATH
Variable (andernfalls könnte es nicht wie beabsichtigt funktionieren).
Ich habe ganze Abschnitte entfernt, die auskommentiert wurden. Vielleicht möchten Sie sie natürlich zurückbringen und auskommentieren.
# 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}"
Diese Datei wird gelesen, wenn Sie eine neue Shell starten. Wann genau, hängt jedoch auch davon ab, wie Ihr Betriebssystemhersteller Bash konfiguriert hat. Um ganz sicher zu sein, dass eine alte Konfiguration Ihre aktuelle Konfiguration nicht mehr beeinträchtigt, müssen Sie herausfinden, ob zum erneuten Starten das Abmelden und erneute Anmelden erforderlich ist oder ob Sie einfach eine neue Shell oder eine neue Terminalsitzung starten können Holen Sie sich eine saubere Tafel.
Überprüfen .bash_profile.pysave
Sie vielleicht noch, ob etwas Nützliches enthalten ist, das Sie behalten möchten, obwohl ich davon ausgehen würde, dass es im Großen und Ganzen mit Ihrer aktuellen Version identisch ist, mit Ausnahme der allerletzten Zeilen.