Rutas duplicadas, problemas con .bash_profile
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_profile
todaví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_profile
y 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_profile
final, 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_profile
del final de la primera línea de mi .bash_profile
no hizo que desapareciera de la salida de la echo $PATH
que se mantuvo sin cambios.
Respuestas
A continuación, se muestra una .bash_profile
versió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_profile
habí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 PATH
más de una vez; probablemente podría eliminar con seguridad incluso la única instancia restante. El significado de export
es 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 PATH
variable (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.pysave
contiene 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.