Как обновить все оболочки bash с помощью команды / скрипта?

8

Всякий раз, когда я изменяю свой .bashrcфайл, мне приходится переходить к каждой оболочке bash и снова вводить его для выполнения изменений.

Есть лучший способ сделать это? Какая-нибудь команда, которая запускается один раз, автоматически сделает a source ~/.bashrcво всех открытых оболочках команд ?

Lazer
источник

Ответы:

6

Нет, я не думаю, что это возможно. И не должно быть. По сути, это означало бы способ внедрения кода в уже запущенную и активную оболочку и представляло бы значительную угрозу безопасности.

Многие процессы демона будут разработаны , чтобы сделать это. Типичным способом было бы отправить им сигнал HUP (зависание), который заставляет их перезапускаться после повторного чтения их файлов конфигурации. Вы могли бы вызвать это с чем-то вроде:

pkill -HUP daemon_name

Однако, делая это на bash, bash просто отключается. Это не демон, и система не ведет себя так, как он.

Суть в том, что вы, вероятно, не будете вносить изменения в ваш bashrc так часто, как проходит время, и это не будет большой проблемой. Когда вы вносите изменения, вам просто нужно повторно получить файл, если вам нужны изменения в работающих оболочках.

Калеб
источник
2

Там нет ничего встроенного в Bash. Вы можете сказать, что, возможно, перезагружать .bashrcкаждый раз, когда он отображает приглашение, через 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

Это большая проблема, доступ к дополнительному файлу которого стоит. Кроме того, это накладывает ограничение на ваш .bashrcфайл: файл должен быть идемпотентным, то есть вы должны иметь возможность загружать его более одного раза без каких-либо побочных эффектов. Например, в приведенном выше фрагменте кода я забочусь , чтобы добавить maybe_reload_bashrcк PROMPT_COMMANDтолько если это не было уже.

Жиль "ТАК - перестань быть злым"
источник
@Kevin Я отклонил ваше редактирование, потому что не было ясно, какие преимущества / недостатки может иметь дополнительный код. Жиль мог иметь побочный эффект в том, что он избегал, сравнивая временную метку с тем, что файл изменился со времени оригинала, и всегда загружая каждую команду, если она изменилась хотя бы один раз. Если вы думаете, что это действительно ошибка, оставьте комментарий здесь, и я уверен, что это будет исправлено.
Калеб
2
@Caleb: Кевин не будет уведомлен вашим комментарием. Для справки, предлагаемое редактирование должно выполняться touch -r ~/.bashrc $bashrc_timestamp_fileпосле поиска ~/.bashrc. Я на самом деле почти написал это, но это не обязательно: это только что было сделано источником .bashrc. Файл метки времени обновляется при каждой .bashrcзагрузке, а не только при начальной загрузке.
Жиль "ТАК - перестань быть злым"