Chemins en double, problèmes avec .bash_profile
J'ai été dirigé ici depuis Stack Overflow après avoir publié une question sur la difficulté à faire fonctionner PyExifTool. Il semble cependant que le problème était multiforme et étant un novice, on m'a dit de chercher de l'aide ici.
Essentiellement, le problème a été réalisé quand on m'a dit de courir ...
bash:~ $ type -all exiftool
qui est revenu ...
exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool
... révélant que quelque part j'avais des doublons.
Par la suite, j'ai couru ...
bash:~ $ echo $PATH
Qui est revenu ...
/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
... qui contient des doublons et ne devrait apparemment pas se terminer par .bash_profile
Maintenant, dans le terminal, je peux nettoyer cela en utilisant ...
bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')
Ce qui précède est un extrait que j'ai obtenu du Linux Journal et qui est censé «presque fonctionner», mais le morceau de code qui «devrait fonctionner» ne semble pas m'aider. L'utilisation du code `` presque fonctionnel '' donne ce qui suit:
/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 :
Je suis un novice absolu, mais je ne pense pas que cela soit censé se terminer :
et clairement le .bash_profile
est toujours présent. Cependant, il semble supprimer les doublons, bien que cela se réinitialise si j'ouvre une nouvelle fenêtre de terminal, ce n'est donc qu'une solution de contournement aiguë.
Voici à quoi ressemble mon profil 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
Je ne sais pas si cela est pertinent ou lié, mais lorsque je lance python à partir de mon Hotbar et que je l'exécute ...
>>> print(os.environ['PATH'])
Il imprime
/usr/bin:/bin:/usr/sbin:/sbin
Alors que lorsque je le lance depuis mon terminal bash en l'utilisant, IDLE3
il renvoie:
/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
Informations périphériques et expérimentation:
Je pense que j'ai probablement raté quelque chose lors de l'installation de FSL, que j'ai fait quelque chose pour moi .bash_profile
et que je suis maintenant hanté en essayant d'apprendre et de développer des compétences de base en programmation. C'était peut-être une erreur manuelle ou peut-être que cela avait quelque chose à voir avec l'homebrew ou Xcode.
Je pourrais supprimer la .bash_profile
fin mais je crains d'avoir déjà fait assez de dégâts et je ne veux pas me résoudre à un problème si laborieux qu'aucun forum Internet ne veut y toucher.
C'est ce qui était censé fonctionner selon Mitch Frazier du Linux Journal . Évidemment, ce n'est pas une réflexion sur lui ou l'article, mais plutôt sur ma compréhension limitée.
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)}'
Cela revient ...
/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$
J'ai également essayé ce qui suit (suggéré par pepa65 ) ...
bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")
Cela revient ...
-bash: -1: substring expression < 0
Quand j'essaye de rechercher des changements en utilisant echo $PATH
...
Je reçois une ligne vierge.
Je sais qu'il est peu probable que cela soit intellectuellement stimulant, je suis donc reconnaissant de toute aide.
MODIFIER 1:
Une tentative naïve de supprimer .bash_profile
de la fin de la première ligne de mon .bash_profile
ne l'a pas fait disparaître de la sortie echo $PATH
qui est restée inchangée.
Réponses
Voici une version réduite et corrigée .bash_profile
qui conviendra peut-être à votre configuration.
Il y avait une ligne problématique au début où ~/.bash_profile
avait été ajoutée par erreur à une ligne par ailleurs correcte. Cependant, j'ai supprimé la ligne entière, car je m'attendrais, et vos diagnostics suggèrent, qu'il ajoutait un répertoire qui était déjà sur la valeur par défaut fournie par le système PATH
.
Il n'y a certainement pas besoin de export PATH
plus d'une fois; vous pourriez probablement supprimer en toute sécurité même l'instance restante. La signification de export
est de marquer une variable à transformer en une variable d' environnement visible par les sous-processus. Une fois que vous avez fait cela, les sous-processus auront accès à la valeur actuelle de la variable, même si la valeur change après le export
. Il est fort probable que la configuration de votre shell à l'échelle du système le fasse déjà pour la PATH
variable (sinon cela ne pourrait pas fonctionner comme prévu).
J'ai supprimé des sections entières qui ont été commentées; vous pourriez bien sûr vouloir les ramener et les décommenter.
# 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}"
Ce fichier est lu lorsque vous démarrez un nouveau shell, mais le moment exact dépendra également de la façon dont votre fournisseur de système d'exploitation a configuré Bash. Pour être complètement sûr qu'aucune ancienne configuration n'interfère plus avec votre configuration actuelle, vous devrez déterminer si vous devez vous déconnecter et vous reconnecter pour recommencer, ou si vous pouvez simplement démarrer un nouveau shell ou une nouvelle session de terminal pour obtenez une ardoise propre.
Peut-être encore vérifiez si .bash_profile.pysave
contient quelque chose d'utile que vous souhaitez conserver, même si je m'attendrais à ce qu'il soit globalement identique à votre version actuelle, à l'exception du tout dernier ensemble de lignes.