Chemins en double, problèmes avec .bash_profile

Aug 16 2020

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_profileest 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, IDLE3il 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_profileet 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_profilefin 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_profilede la fin de la première ligne de mon .bash_profilene l'a pas fait disparaître de la sortie echo $PATHqui est restée inchangée.

Réponses

tripleee Aug 16 2020 at 14:21

Voici une version réduite et corrigée .bash_profilequi conviendra peut-être à votre configuration.

Il y avait une ligne problématique au début où ~/.bash_profileavait é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 PATHplus d'une fois; vous pourriez probablement supprimer en toute sécurité même l'instance restante. La signification de exportest 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 PATHvariable (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.pysavecontient 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.