Sáng tạo và liên quan đến tín hiệu, bạn nói gì? ĐỒNG Ý:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Chuck mà vào .bashrc
và đi. Điều này sử dụng các tín hiệu để báo cho mọi bash
quá trình kiểm tra các mục lịch sử mới khi một mục khác thoát ra. Điều này là khá khủng khiếp, nhưng nó thực sự hoạt động.
Làm thế nào nó hoạt động?
trap
đặt một bộ xử lý tín hiệu cho tín hiệu hệ thống hoặc một trong các sự kiện bên trong của Bash. Các EXIT
sự kiện là bất kỳ chấm dứt kiểm soát của vỏ, trong khi USR1
là SIGUSR1
một tín hiệu vô nghĩa chúng ta đang chiếm giữ.
Bất cứ khi nào vỏ thoát ra, chúng tôi:
- Nối tất cả lịch sử vào tập tin một cách rõ ràng.
- Vô hiệu hóa
SIGUSR1
trình xử lý và làm cho lớp vỏ này bỏ qua tín hiệu.
- Gửi tín hiệu cho tất cả các
bash
quy trình đang chạy từ cùng một người dùng.
Khi SIGUSR1
đến nơi, chúng tôi:
- Tải tất cả các mục mới từ tệp lịch sử vào danh sách lịch sử trong bộ nhớ của shell.
Do cách Bash xử lý tín hiệu, bạn sẽ không thực sự có được dữ liệu lịch sử mới cho đến khi bạn nhấn Entervào lần tiếp theo, vì vậy điều này không làm gì tốt hơn ở mặt trước đó hơn là đưa history -n
vào PROMPT_COMMAND
. Tuy nhiên, nó không lưu đọc tệp khi không có gì xảy ra, và không có chữ viết nào cho đến khi thoát khỏi vỏ.
Vẫn còn một vài vấn đề ở đây. Đầu tiên là phản hồi mặc định SIGUSR1
là chấm dứt shell. Bất kỳ bash
quy trình nào khác (chạy tập lệnh shell chẳng hạn) sẽ bị hủy. .bashrc
không được tải bởi các vỏ không tương tác. Thay vào đó, một tệp có tên BASH_ENV
được tải : bạn có thể đặt biến đó trong môi trường của mình trên toàn cầu để trỏ đến một tệp có:
trap '' USR1
trong đó để bỏ qua các tín hiệu trong chúng (giải quyết vấn đề).
Cuối cùng, mặc dù điều này làm những gì bạn yêu cầu, thứ tự bạn nhận được sẽ hơi bất thường. Cụ thể, các bit của lịch sử sẽ được lặp lại theo các thứ tự khác nhau khi chúng được tải lên và lưu riêng. Điều đó về cơ bản vốn có trong những gì bạn yêu cầu, nhưng hãy lưu ý rằng lịch sử mũi tên lên sẽ trở nên ít hữu ích hơn vào thời điểm này. Lịch sử thay thế và tương tự sẽ được chia sẻ và làm việc tốt, mặc dù.