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

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

ファイルを変更するたびに、.bashrc各bashシェルに移動して再インポートして変更を実装する必要があります。

もっと良い方法がありますか?一度実行される特定のコマンドは、source ~/.bashrc開いているすべてのbashシェルで自動的にアクションを実行しますか?

答え1

いいえ、私はこれが可能だとは思いません。また、そうしてはいけません。これは本質的に起動されアクティブなシェルにコードを挿入する方法に対応し、深刻なセキュリティ上の脅威を引き起こす可能性があります。

多くのデーモンはいちょうどそうすることを目指してください。一般的なアプローチは、設定ファイルを再読み込みしてから再開するために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_bashrcPROMPT_COMMAND

関連情報