コマンド/スクリプトを使用してすべてのbashシェルを更新する方法は?


8

.bashrcファイルを変更するときはいつでも、各bashシェルに移動し、変更を反映させるために再度ソースにする必要があります。

これを行うより良い方法はありますか?一度実行するいくつかのコマンドはsource ~/.bashrc、開いているすべてのbashシェルで自動的に実行されますか?

回答:


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追加のコードの利点/欠点が明確でないため、編集を拒否しました。Gillesは、元のファイルからファイルが変更された場合にのみタイムスタンプの比較を維持し、一度でも変更された場合は常にすべてのコマンドをロードすることで、回避していたという副作用を覚えている可能性があります。本当にバグがあると思われる場合は、ここにコメントを残してください。修正されると思います。
カレブ

2
@Caleb:Kevinはコメントで通知されません。参考までに、ソースの後に実行することをお勧めします。私は実際にそれをほとんど書きました、しかしそれは必要ではありません:それはただsourcedによって行われただけです。タイムスタンプファイルは、初期ロード時だけでなく、ロードされるたびに更新されます。touch -r ~/.bashrc $bashrc_timestamp_file~/.bashrc.bashrc.bashrc
Gilles「SO-邪悪なことをやめなさい」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.