Después de iniciar un terminal bash, noté que la variable PATH contiene entradas duplicadas. Mi terminal inicia un shell de inicio de sesión , por lo que ~/.bash_profilese obtiene, seguido de ~/.profiley ~/.bashrc. Solo en ~/.profilecreo las entradas de rutas que están duplicadas.
Para ser pedante, este es el orden en el que se obtienen los archivos que DEBEN obtenerse:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Antes de que alguien marque esto como un duplicado de "La variable PATH contiene duplicados", sigue leyendo.
Al principio pensé que esto tenía que ver con el ~/.profileorigen dos veces, así que hice que el archivo escribiera en un archivo de registro cada vez que se obtuvo, y sorprendentemente solo registró una entrada, lo que me dice que solo se obtuvo una vez. Aún más sorprendente es el hecho de que cuando comento las entradas que estaban en ~/.profile, las entradas todavía aparecen en la PATHvariable. Esto me ha llevado a tres conclusiones, una de las cuales se descartó rápidamente:
- Bash ignora los comentarios de bash válidos y aún ejecuta el código comentado
- Hay un script que lee
~/.profilee ignora cualquier código que imprima una salida (el archivo de registro, por ejemplo) - Hay otra copia de mi
~/.profileque está siendo obtenida en otro lugar
El primero, rápidamente concluí que no era el caso debido a algunas pruebas rápidas. La segunda y tercera opciones son donde necesito ayuda.
¿Cómo recopilo un registro de scripts que se ejecutan cuando se inicia mi terminal? Utilicé echolos archivos que verifiqué para saber si provienen de bash, pero necesito encontrar un método concluyente que rastree la ejecución hasta el punto en que el terminal esté listo para que empiece a escribir en él.
Si lo anterior no es posible, ¿alguien puede sugerirme dónde más puedo mirar para ver qué scripts se están ejecutando ?
Referencia futura
Este es el script que ahora uso para agregar a mi ruta:
function add_to_path() {
for path in ${2//:/ }; do
if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
new_path="$path:${!1#:}"
export "$1"="${new_path%:}" # remove trailing :
fi
done
}
Lo uso así:
add_to_path 'PATH' "/some/path/bin"
El script verifica si la ruta ya existe en la variable antes de anteponerla.
Para los usuarios de zsh, puede usar este equivalente:
function add_to_path() {
for p in ${(s.:.)2}; do
if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
new_path="$p:${(P)1#:}"
export "$1"="${new_path%:}"
fi
done
}
Editar 28/8/2018
Una cosa más que encontré que podría hacer con este script es también arreglar la ruta. Entonces, al comienzo de mi .bashrcarchivo, hago algo como esto:
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path
Depende de usted con qué PATHdebe comenzar. Examine PATHprimero para decidir.
~/.profiley ~/.bashrcde~/.bash_profile
~/.profilesi~/.bash_profileno existe ...