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_profile
se obtiene, seguido de ~/.profile
y ~/.bashrc
. Solo en ~/.profile
creo 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 ~/.profile
origen 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 PATH
variable. 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
~/.profile
e ignora cualquier código que imprima una salida (el archivo de registro, por ejemplo) - Hay otra copia de mi
~/.profile
que 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é echo
los 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 .bashrc
archivo, 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é PATH
debe comenzar. Examine PATH
primero para decidir.
~/.profile
si~/.bash_profile
no existe ...~/.profile
y~/.bashrc
de~/.bash_profile
Respuestas:
Si su sistema tiene
strace
, puede enumerar los archivos abiertos por el shell, por ejemplo, utilizando(
-li
significa shell de inicio de sesión interactivo; utilícelo solo-i
para un shell interactivo sin inicio de sesión).Esto mostrará una lista de archivos que el shell abrió o intentó abrir. En mi sistema, son los siguientes:
/etc/profile
/etc/profile.d/*
(varios scripts en/etc/profile.d/
)/home/<username>/.bash_profile
(esto falla, no tengo ese archivo)/home/<username>/.bash_login
(esto falla, no tengo ese archivo)/home/<username>/.profile
/home/<username>/.bashrc
/home/<username>/.bash_history
(historial de líneas de comando; esto no es un script)/usr/share/bash-completion/bash_completion
/etc/bash_completion.d/*
(varios scripts que proporcionan funcionalidad de autocompletado)/etc/inputrc
(define las asociaciones de teclas; esto no es un script)Úselo
man strace
para más información.fuente
echo $0
en el terminal da en-bash
lugar de lo esperadobash
. ¿Tienes alguna otra sugerencia para esto?$0
es un guión-
, o cuando se invoca con la opción-l
.echo PATH=\""$PATH"\"
al principio y al final de.profile
y.bashrc
? ¿Y por qué no haces lo que todos hacen y configuras la RUTA completamente o, si agregas un directorio, guardasecho ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"
:?sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"
en macOS. (solo reemplacestrace
condtruss
)