Come aggiornare tutte le shell bash usando un comando / script?


8

Ogni volta che modifico il mio .bashrcfile, devo andare su ogni shell bash e ricominciarlo per effettuare le modifiche.

C'è un modo migliore per farlo? Alcuni comandi eseguiti una volta eseguiranno automaticamente un source ~/.bashrcin tutte le shell bash aperte?

Risposte:


6

No, non credo sia possibile. Né dovrebbe essere. Ciò equivarrebbe sostanzialmente a un modo per iniettare codice in una shell già avviata e attiva e costituirebbe una significativa minaccia alla sicurezza.

Molti processi daemon sono progettati per fare questo. Il modo tipico sarebbe di inviare loro il segnale HUP (hangup) che li fa riavviare dopo aver riletto i loro file di configurazione. Puoi attivarlo con qualcosa del tipo:

pkill -HUP daemon_name

Tuttavia, quando lo si fa su bash, bash si spegne. Non è un demone e il sistema non si comporta come uno.

Il lungo e il breve è che probabilmente non continuerai a apportare modifiche al tuo bashrc così frequentemente col passare del tempo e non sarà un grosso problema. Quando si apportano modifiche, sarà sufficiente rinominare il file se sono necessarie le modifiche nell'esecuzione delle shell.


2

Non c'è niente incorporato in bash. Si potrebbe dire che potrebbe ricaricare .bashrcogni volta che viene visualizzato un prompt, attraverso 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

Questo è un sacco di problemi a cui un file extra accede per quello che vale. Inoltre, pone un limite al tuo .bashrc: il file deve essere idempotente, cioè devi essere in grado di caricarlo più di una volta senza effetti negativi. Per esempio, nel frammento di sopra, mi prendo cura di aggiungere maybe_reload_bashrcal PROMPT_COMMANDsolo se non è già lì.


@Kevin Ho rifiutato la tua modifica perché non era chiaro quali vantaggi / svantaggi potesse avere il codice aggiuntivo. Gilles potrebbe avere un effetto collaterale in mente che stava evitando tenendo il confronto del timestamp solo se il file è cambiato dall'originale e caricando sempre su ogni comando se è cambiato anche una volta. Se pensi che ci sia davvero un bug, lascia un commento qui e sono sicuro che verrà risolto.
Caleb,

2
@Caleb: Kevin non verrà avvisato dal tuo commento. Per riferimento, la modifica suggerita deve essere eseguita touch -r ~/.bashrc $bashrc_timestamp_filedopo l'approvvigionamento ~/.bashrc. In realtà l'ho quasi scritto, ma non è necessario: è stato appena fatto dalla fonte .bashrc. Il file timestamp viene aggiornato ogni volta che .bashrcviene caricato, non solo sul caricamento iniziale.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.