Bagaimana cara me-refresh semua shell bash menggunakan perintah / skrip?

8

Setiap kali saya memodifikasi .bashrcfile saya , saya harus pergi ke setiap bash shell dan sumbernya lagi untuk melakukan perubahan.

Apakah ada cara yang lebih baik untuk melakukan ini? Beberapa perintah yang dijalankan sekali akan secara otomatis melakukan source ~/.bashrcsemua bash shell terbuka?

Lazer
sumber

Jawaban:

6

Tidak, saya pikir ini tidak mungkin. Seharusnya juga tidak. Ini pada dasarnya merupakan cara untuk menyuntikkan kode ke dalam shell yang sudah diluncurkan dan aktif dan akan menimbulkan ancaman keamanan yang signifikan.

Banyak proses daemon yang dirancang untuk melakukan hal ini. Cara tipikal adalah mengirimkan sinyal HUP (hangup) yang menyebabkan mereka diluncurkan kembali setelah membaca kembali file konfigurasi mereka. Anda dapat memicu ini dengan sesuatu seperti:

pkill -HUP daemon_name

Namun ketika melakukan ini di bash, bash hanya dimatikan. Ini bukan daemon dan sistem tidak berperilaku seperti itu.

Panjang dan pendeknya adalah bahwa Anda mungkin tidak akan terus melakukan perubahan pada bashrc Anda begitu sering seiring berjalannya waktu dan itu tidak akan banyak masalah. Ketika Anda benar-benar melakukan perubahan, Anda hanya perlu mengisikan ulang file jika Anda membutuhkan perubahan dalam menjalankan shell.

Caleb
sumber
2

Tidak ada yang dibangun menjadi bash. Anda bisa mengatakannya untuk memuat ulang .bashrcsetiap kali itu menampilkan prompt, melalui 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

Ini adalah banyak masalah yang diakses oleh file ekstra untuk apa nilainya. Selain itu, ia memberi batasan pada Anda .bashrc: file harus idempoten, yaitu Anda harus dapat memuatnya lebih dari sekali tanpa efek buruk. Sebagai contoh, dalam potongan di atas, saya berhati-hati untuk menambahkan maybe_reload_bashrcke PROMPT_COMMANDhanya jika tidak sudah ada.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
@Kevin saya menolak hasil edit Anda karena tidak jelas apa kelebihan / kerugian dari kode tambahan. Gilles dapat memiliki efek samping dalam pikiran bahwa ia menghindari dengan menjaga perbandingan cap waktu hanya jika file telah berubah sejak aslinya dan selalu memuat pada setiap perintah jika itu diubah sekali saja. Jika menurut Anda benar-benar ada bug, tinggalkan komentar di sini dan saya yakin itu akan diperbaiki.
Caleb
2
@ Caleb: Kevin tidak akan diberitahu oleh komentar Anda. Untuk referensi, edit yang disarankan adalah dijalankan touch -r ~/.bashrc $bashrc_timestamp_filesetelah sumber ~/.bashrc. Saya sebenarnya hampir menulis itu, tapi itu tidak perlu: itu hanya dilakukan oleh sumber .bashrc. File stempel waktu diperbarui setiap kali .bashrcdimuat, tidak hanya pada pemuatan awal.
Gilles 'SANGAT berhenti menjadi jahat'