¿Cómo actualizar todos los shells bash usando un comando / script?

8

Cada vez que modifico mi .bashrcarchivo, tengo que ir a cada shell bash y buscarlo nuevamente para efectuar los cambios.

¿Hay una mejor manera de hacer esto? ¿Algún comando que se ejecute una vez hará automáticamente un source ~/.bashrcen todos los shells bash abiertos?

Lazer
fuente

Respuestas:

6

No, no creo que esto sea posible. Tampoco debería ser. Básicamente, esto equivaldría a una forma de inyectar código en un shell ya lanzado y activo, y representaría una amenaza de seguridad significativa.

Muchos procesos de daemon están diseñados para hacer esto. La forma típica sería enviarles la señal HUP (colgar) que hace que se reinicien después de volver a leer sus archivos de configuración. Podría desencadenar esto con algo como:

pkill -HUP daemon_name

Sin embargo, al hacer esto en bash, bash simplemente se apaga. No es un demonio y el sistema no hace que se comporte como tal.

En resumidas cuentas, es probable que no sigas haciendo cambios en tu bashrc con tanta frecuencia como pasa el tiempo y no será un gran problema. Cuando realice cambios, solo tendrá que volver a obtener el archivo si necesita los cambios en los shells en ejecución.

Caleb
fuente
2

No hay nada integrado en bash. Podrías decirle que quizás se vuelva a cargar .bashrccada vez que muestra un mensaje, a través PROMPT_COMMAND.

## Create a timestamp file, dated like the .bashrc that was read.
## There is a small race condition: if .bashrc is modified as the shell is
## just starting, before getting to this line, this instance won't detect
## that modification.
bashrc_timestamp_file=~/.bashrc-timestamp-$$
touch -r ~/.bashrc "$bashrc_timestamp_file"
## Remove the timestamp file on exit. The timestamp file will be left
## behind on a crash.
trap 'rm "$bashrc_timestamp_file"' EXIT HUP TERM INT QUIT
maybe_reload_bashrc () {
  if [[ ~/.bashrc -nt $bashrc_timestamp_file ]]; then
    . ~/.bashrc
  fi
}
if [[ $PROMPT_COMMAND != *maybe_reload_bashrc* ]]; then
  PROMPT_COMMAND="maybe_reload_bashrc
$PROMPT_COMMAND"
fi

Esto es un montón de problemas a los que accede un archivo adicional por lo que vale. Además, impone una restricción a su .bashrc: el archivo debe ser idempotente, es decir, debe poder cargarlo más de una vez sin efectos nocivos. Por ejemplo, en el fragmento anterior, cuido añadir maybe_reload_bashrca PROMPT_COMMANDsólo si no está allí ya.

Gilles 'SO- deja de ser malvado'
fuente
@Kevin Rechacé tu edición porque no estaba claro qué ventajas / desventajas podría tener el código adicional. Gilles podría tener un efecto secundario en mente que estaba evitando al mantener la comparación de marca de tiempo solo si el archivo ha cambiado desde el original y siempre se carga en cada comando si se cambia incluso una vez. Si crees que realmente hay un error, deja un comentario aquí y estoy seguro de que se solucionará.
Caleb
2
@Caleb: Kevin no será notificado por tu comentario. Como referencia, la edición sugerida debe ejecutarse touch -r ~/.bashrc $bashrc_timestamp_filedespués del abastecimiento ~/.bashrc. De hecho, casi escribí eso, pero no es necesario: solo lo han hecho las fuentes .bashrc. El archivo de marca de tiempo se actualiza cada vez que .bashrcse carga, no solo en la carga inicial.
Gilles 'SO- deja de ser malvado'