Doppelte Pfade, Probleme mit .bash_profile

Aug 16 2020

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_profileist 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, IDLE3wird 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_profileund 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_profileEnde 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_profiledas Ende der ersten Zeile von mir zu entfernen .bash_profile, ließ es nicht verschwinden, dessen Ausgabe echo $PATHunverändert blieb.

Antworten

tripleee Aug 16 2020 at 14:21

Hier ist eine reduzierte und korrigierte, .bash_profiledie hoffentlich für Ihre Konfiguration angemessen ist.

Am Anfang gab es eine problematische Zeile, in der ~/.bash_profilefä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 PATHmehr als einmal; Wahrscheinlich könnten Sie sogar die eine verbleibende Instanz sicher entfernen. Die Bedeutung von exportbesteht 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 PATHVariable (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.pysaveSie 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.