Rutas duplicadas, problemas con .bash_profile

Aug 16 2020

Me dirigieron aquí desde Stack Overflow después de publicar una pregunta sobre la lucha para que PyExifTool funcione. Sin embargo, parece que el problema era multifacético y, siendo un novato, me dijeron que buscara ayuda aquí.

Básicamente, el problema se dio cuenta cuando me dijeron que corriera ...

bash:~ $ type -all exiftool

que regresó ...

exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool

... revelando que en algún lugar tenía duplicados.

Posteriormente, corrí ...

bash:~ $ echo $PATH

Que regresó ...

/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

... que contiene duplicados y aparentemente no debería terminar con .bash_profile

Ahora en la terminal, puedo limpiar esto usando ...

bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')

Lo anterior es un fragmento que obtuve de Linux Journal que se supone que "casi funciona", pero el fragmento de código que "debería funcionar" no parece ayudarme. El uso del código 'casi funcional' da lo siguiente:

/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 :

Soy un novato absoluto, pero no creo que se suponga que termine :y claramente .bash_profiletodavía está presente. Sin embargo, parece eliminar los duplicados, aunque esto se restablece si abro una nueva ventana de terminal, por lo que es solo una solución alternativa.

Así es como se ve mi perfil de 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

No estoy seguro de si esto es relevante o relacionado, pero cuando lanzo Python desde mi Hotbar y ejecuto ...

>>> print(os.environ['PATH'])

Imprime

/usr/bin:/bin:/usr/sbin:/sbin

Mientras que cuando lo lanzo desde mi terminal bash usándolo IDLE3, devuelve:

/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

Información periférica y experimentación:

Creo que probablemente arruiné algo al instalar FSL, hice algo en mí .bash_profiley ahora me persiguen mientras trato de aprender y desarrollar habilidades básicas de codificación. Quizás fue un error manual o quizás tuvo algo que ver con homebrew o Xcode.

Podría eliminar el .bash_profilefinal, pero me preocupa que ya he hecho suficiente daño y no quiero solucionar un problema tan laborioso que ningún foro de Internet quiere tocarlo.

Esto es lo que se suponía que debía funcionar según Mitch Frazier de Linux Journal . Obviamente, esto no es un reflejo de él o del artículo, sino más bien de mi comprensión limitada.

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)}'

Esto vuelve ...

/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$

También probé lo siguiente (sugerido por pepa65 ) ...

bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")

Esto vuelve ...

-bash:  -1: substring expression < 0

Cuando intento buscar cambios usando echo $PATH...

Recibo una línea en blanco.

Sé que es poco probable que esto sea intelectualmente estimulante, así que agradezco cualquier ayuda.

EDITAR 1:

Un ingenuo intento de eliminar .bash_profiledel final de la primera línea de mi .bash_profileno hizo que desapareciera de la salida de la echo $PATHque se mantuvo sin cambios.

Respuestas

tripleee Aug 16 2020 at 14:21

A continuación, se muestra una .bash_profileversión reducida y corregida que seguramente es adecuada para su configuración.

Había una línea problemática al principio en la que se ~/.bash_profilehabía agregado erróneamente a una línea que por lo demás era correcta. Sin embargo, eliminé toda la línea, ya que esperaría, y sus diagnósticos sugieren, que estaba agregando un directorio que ya estaba en el valor predeterminado proporcionado por el sistema PATH.

Definitivamente no hay necesidad de hacerlo export PATHmás de una vez; probablemente podría eliminar con seguridad incluso la única instancia restante. El significado de exportes marcar una variable para convertirla en una variable de entorno que sea visible para los subprocesos. Una vez que haya hecho eso, los subprocesos tendrán acceso al valor actual de la variable, incluso si el valor cambia después de export. Es muy probable que la configuración de shell de todo el sistema ya haga esto para la PATHvariable (de lo contrario, no podría funcionar como se esperaba).

Eliminé secciones enteras que estaban comentadas; por supuesto, es posible que desee recuperarlos y descomentarlos.

# 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}"

Este archivo se lee cuando inicia un nuevo shell, aunque cuándo exactamente también dependerá de cómo su proveedor de sistema operativo haya configurado Bash. Para estar completamente seguro de que cualquier configuración anterior ya no interfiere con su configuración actual, tendrá que averiguar si es necesario cerrar la sesión y volver a iniciarla para comenzar de nuevo, o si simplemente puede iniciar un nuevo shell o una nueva sesión de terminal conseguir una pizarra limpia.

Quizás aún revise si .bash_profile.pysavecontiene algo útil que desea conservar, aunque esperaría que sea en general idéntico a su versión actual, excepto por el último conjunto de líneas.