Wie aktualisiere ich alle Bash-Shells mit einem Befehl / Skript?

8

Immer wenn ich meine .bashrcDatei ändere, muss ich zu jeder Bash-Shell gehen und sie erneut als Quelle verwenden, um die Änderungen zu bewirken.

Gibt es einen besseren Weg, dies zu tun? Ein Befehl, der einmal ausgeführt wird, führt automatisch eine source ~/.bashrcin allen offenen Bash-Shells aus?

Laser
quelle

Antworten:

6

Nein, ich denke nicht, dass dies möglich ist. Es sollte auch nicht sein. Dies würde im Grunde eine Möglichkeit darstellen, Code in eine bereits gestartete und aktive Shell einzufügen, und würde eine erhebliche Sicherheitsbedrohung darstellen.

Viele Daemon-Prozesse sind dafür ausgelegt. Der typische Weg wäre, ihnen das HUP-Signal (Hangup) zu senden, das sie nach dem erneuten Lesen ihrer Konfigurationsdateien neu starten lässt. Sie könnten dies mit etwas auslösen wie:

pkill -HUP daemon_name

Wenn Sie dies jedoch bei Bash tun, wird Bash einfach ausgeschaltet. Es ist kein Daemon und das System hat nicht, dass es sich wie einer verhält.

Das lange und das kurze daran ist, dass Sie wahrscheinlich im Laufe der Zeit nicht so häufig Änderungen an Ihrem Bashrc vornehmen werden und es kein großes Problem sein wird. Wenn Sie Änderungen vornehmen, müssen Sie die Datei nur erneut bereitstellen, wenn Sie die Änderungen in den laufenden Shells benötigen.

Caleb
quelle
2

In Bash ist nichts eingebaut. Sie können festlegen, dass es möglicherweise .bashrcjedes Mal neu geladen wird, wenn eine Eingabeaufforderung angezeigt wird 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

Dies ist eine Menge Ärger, auf den eine zusätzliche Datei zugreift, was es wert ist. Außerdem stellt dies eine Einschränkung für Sie dar .bashrc: Die Datei muss idempotent sein, dh Sie müssen sie mehr als einmal ohne negative Auswirkungen laden können. Zum Beispiel, im obigen Snippet, füge ich nur hinzu maybe_reload_bashrc, PROMPT_COMMANDwenn es noch nicht da ist.

Gilles 'SO - hör auf böse zu sein'
quelle
@ Kevin Ich habe Ihre Bearbeitung abgelehnt, weil nicht klar war, welche Vor- und Nachteile der zusätzliche Code haben könnte. Gilles könnte einen Nebeneffekt haben, den er vermieden hat, indem er den Zeitstempelvergleich beibehalten hat, nur wenn sich die Datei seit dem Original geändert hat, und immer bei jedem Befehl geladen wird, wenn sie auch nur einmal geändert wird. Wenn du denkst, dass es wirklich einen Fehler gibt, hinterlasse hier einen Kommentar und ich bin sicher, dass er behoben wird.
Caleb
2
@Caleb: Kevin wird durch Ihren Kommentar nicht benachrichtigt. Als Referenz wird vorgeschlagen , die Bearbeitungtouch -r ~/.bashrc $bashrc_timestamp_file nach dem Sourcing auszuführen ~/.bashrc. Eigentlich hätte ich das fast geschrieben, aber es ist nicht notwendig: Es wurde nur von der Quelle gemacht .bashrc. Die Zeitstempeldatei .bashrcwird beim Laden aktualisiert , nicht nur beim ersten Laden.
Gilles 'SO - hör auf böse zu sein'