Làm thế nào để làm mới tất cả các bash shell bằng lệnh / script?


8

Bất cứ khi nào tôi sửa đổi .bashrctệp của mình , tôi phải đi đến từng bash shell và lấy lại nguồn để thực hiện các thay đổi.

Có cách nào tốt hơn để làm điều này? Một số lệnh chạy một lần sẽ tự động thực hiện source ~/.bashrctrong tất cả các shell bash mở?

Câu trả lời:


6

Không, tôi không nghĩ rằng điều này là có thể. Cũng không nên. Điều này về cơ bản sẽ là một cách để tiêm mã vào một vỏ đã được khởi chạy và hoạt động và sẽ gây ra một mối đe dọa bảo mật đáng kể.

Nhiều quy trình daemon được thiết kế để làm điều này. Cách điển hình là gửi cho họ tín hiệu HUP (gác máy) khiến chúng khởi chạy lại sau khi đọc lại các tệp cấu hình của chúng. Bạn có thể kích hoạt điều này với một cái gì đó như:

pkill -HUP daemon_name

Tuy nhiên, khi làm điều này trên bash, bash chỉ tắt. Nó không phải là một daemon và hệ thống không có nó hoạt động như một.

Điểm dài và ngắn của nó là bạn có thể sẽ không tiếp tục thay đổi bashrc của mình thường xuyên khi thời gian trôi qua và nó sẽ không thành vấn đề. Khi bạn thực hiện thay đổi, bạn sẽ phải lấy lại nguồn tệp nếu bạn cần những thay đổi trong việc chạy shell.


2

Không có gì được xây dựng thành bash. Bạn có thể yêu cầu nó tải lại .bashrcmỗi lần nó hiển thị lời nhắc 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

Đây là rất nhiều rắc rối một tập tin bổ sung truy cập cho những gì nó có giá trị. Ngoài ra, nó đặt một ràng buộc đối với bạn .bashrc: tệp phải ở trạng thái tạm thời, tức là bạn phải có thể tải nó nhiều lần mà không có hiệu ứng xấu. Ví dụ: trong đoạn trích ở trên, tôi cẩn thận chỉ thêm maybe_reload_bashrcvào PROMPT_COMMANDnếu chưa có.


@Kevin Tôi đã từ chối chỉnh sửa của bạn vì không rõ những ưu điểm / nhược điểm mà mã bổ sung có thể có. Gilles có thể có một tác dụng phụ trong tâm trí mà anh ta đang tránh bằng cách giữ dấu thời gian so sánh chỉ khi tệp đã thay đổi so với bản gốc và luôn tải trên mỗi lệnh nếu nó thay đổi dù chỉ một lần. Nếu bạn nghĩ rằng thực sự có một lỗi, hãy để lại nhận xét ở đây và tôi chắc chắn rằng nó sẽ được sửa.
Caleb

2
@Caleb: Kevin sẽ không được thông báo bởi bình luận của bạn. Để tham khảo, chỉnh sửa được đề xuất là chạy touch -r ~/.bashrc $bashrc_timestamp_filesau khi tìm nguồn cung ứng ~/.bashrc. Tôi thực sự gần như đã viết điều đó, nhưng nó không cần thiết: nó chỉ được thực hiện bởi nguồn gốc .bashrc. Tệp dấu thời gian được cập nhật bất cứ khi nào .bashrcđược tải, không chỉ trên tải ban đầu.
Gilles 'SO- đừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.