Cách nhận lịch sử bash được chia sẻ giữa các tab khác nhau


19

Tôi đã sử dụng câu trả lời trong /unix//a/1292/41729 để kích hoạt lịch sử chia sẻ thời gian thực giữa các thiết bị đầu cuối bash riêng biệt. Như đã giải thích trong câu trả lời ở trên, điều này đạt được bằng cách thêm:

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Điều này hoạt động tốt nếu các bash shell riêng biệt (ví dụ: mở các thiết bị bash khác nhau bằng cách sử dụng CTRL+ALT+T. Tuy nhiên, nó không hoạt động nếu tôi sử dụng tabs(từ một thiết bị đầu cuối mở `CTRL + SHIFT + T) chứ không phải là các cửa sổ mới. Tôi có thể chia sẻ lịch sử bash giữa các tab khác nhau không?

CẬP NHẬT: Tôi nhận thấy một hành vi bất thường: nếu tôi gõ CTRL+Cthì lệnh cuối cùng được gõ vào bất kỳ thiết bị đầu cuối nào khác (cả tab hoặc không) được hiển thị chính xác. Nó giống như nếu CTRL + C buộc một luồng lịch sử để sau đó nó được chia sẻ chính xác.

Ví dụ: các đầu ra (T1 biểu thị đầu cuối 1 và đầu cuối 2):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

Hy vọng điều này có thể cung cấp bất kỳ gợi ý!


Bạn đã thêm nó vào ~.bashrctập tin của bạn ? Mặt khác, xuất các biến đó là vô nghĩa; Chỉ lãng phí không gian môi trường.
geirha

@geirha vâng tôi đã thêm vào tập tin .bashrc của mình. Cảm ơn các bình luận về xuất khẩu.
lucacerone

Câu trả lời:


2

Có vẻ như bạn đang cố truy cập vào lịch sử của thiết bị đầu cuối khác trước khi quá trình đồng bộ hóa diễn ra. PROMPT_COMMANDđược thực thi ngay trước khi một dấu nhắc mới được in, tức là sau khi bạn chạy lệnh và trước khi bạn gõ lệnh tiếp theo. Vì vậy, nó sẽ không xảy ra ngay lập tức trong T1; bạn phải khiến một dấu nhắc mới được hiển thị.

Để kiểm tra điều này, hãy thử biến thể này trên các bước của bạn (tôi đã thêm một phần bổ sung <enter>trong T1):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

Với lần nhấn thêm này, bạn sẽ nhận được một dấu nhắc mới, chạy PROMPT_COMMANDvà đồng bộ hóa lịch sử của bạn, và vì vậy tôi mong đợi mũi tên lên này sẽ lấy ra cdthay vì ls, như bạn muốn. Thật không may, tôi không nghĩ có một cách để làm cho việc đồng bộ hóa xảy ra tức thời trong tất cả các thiết bị đầu cuối mà không cần chạy bất kỳ lệnh nào như bạn muốn; thực tế, điều này sẽ yêu cầu tất cả các phiên đăng nhập của bạn phải được đồng bộ hóa danh sách lịch sử của họ liên tục, điều này sẽ gây lãng phí rất lớn cho thông lượng CPU và đĩa.


bạn đã đúng, nhấn enter nó được đồng bộ hóa sau. Ngay cả khi có sự lãng phí bộ nhớ hoặc CPU, làm cách nào tôi có thể buộc đồng bộ hóa? (Nếu quá nhiều tôi luôn có thể vô hiệu hóa nó, nhưng tôi muốn dùng thử)
lucacerone

1

Tôi đã hỏi cùng một câu hỏi và đây là câu trả lời tôi đã đưa ra ....

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "$@"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync


hai câu hỏi trước khi tôi thử: tôi có nên xóa hystory khác - tùy chọn sau đó không? Điều này đi vào .bashrc phải không?
lucacerone

tiếc là nó không hoạt động ...
lucacerone

Mỗi lần HISTFILESIZEthay đổi, nó tự động cố gắng cắt bớt tệp lịch sử hiện có. Thay đổi HISTSIZEcó ảnh hưởng tương tự đến lịch sử hiện tại. Để tham khảo, hãy xem bình luận trong variables.cbash src ngay trước đó sv_histsize.
Brian Vandenberg

1

thêm các dòng đó vào .bashrctập tin của bạn

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" \$1)}'; $PROMPT_COMMAND"

chú thích:

Ban đầu, tôi đã thực hiện khoang thử nghiệm của mình để gửi tín hiệu USR1 đến bash với killall, sau đó tôi nghĩ sẽ sử dụng tên shell duy nhất, một bản sao bash có tên testshell, để tránh việc giết các shell của riêng tôi có thể chạy (ví dụ như các quy trình cron) đang làm việc.

Killall không đủ chọn lọc, tôi đã thay thế nó bằng một tập lệnh chỉ giết các quy trình bash chặt chẽ thành một tty ( ps acác báo cáo chỉ xử lý được gắn với một tty)

Đừng quên khởi động lại phiên của bạn để có một PROMPT_COMMAND mới, khi tôi đang kiểm tra tôi đã thấy nhiều thử nghiệm trước đây của tôi được xếp chồng lên nhau trong PROMPT_COMMAND.


Bạn không cần người dùng mới và trình bao khác, bạn chỉ có thể yêu cầu chỉ killallgửi tín hiệu đến các quy trình của cùng một người dùng với một -uđối số bổ sung , e.g. -u $ (whoami) `.
Philipp Wendler

Tôi nghĩ rằng cú pháp cho csh là sai ... @PhilippWendler bạn có thể vui lòng giải thích một chút không?
lucacerone

Câu hỏi là về bash, vì vậy tôi đã sử dụng cú pháp bash. Tôi không biết csh. Đối với bash, killall -q -USR1 -u $(whoami) bashgửi tín hiệu USR1 đến tất cả các quy trình bash của người dùng hiện tại.
Philipp Wendler

@Philipp ty btw Tôi đã không thử nghiệm giải pháp shell chuyên dụng, đó là sửa một trường hợp trong đó tập lệnh cron bash sẽ chạy.
Emmanuel

@LucaCerone Tôi viết lại dường như hoạt động
Emmanuel

0

Tôi đã có hành vi kỳ lạ tương tự trong Yakuake khi cố gắng tạo dấu nhắc bash phức tạp sẽ hiển thị số lần đăng nhập khác. Số lượng không tăng cho các tab. Cách giải quyết của tôi là bảo Yakuake chạy bashlại trong mỗi tab mới, về cơ bản bắt đầu bash trong bash. Nó bắt đầu làm việc hoàn hảo. Có thể nó sẽ giúp bạn quá. Tôi đoán mù quáng là GUI cho giao diện điều khiển tải bash cấu hình chính nó và sau đó cung cấp chúng cho các trường hợp bash. Có thể đó là để có thể mân mê chúng.


Tôi đã thử tải bash trong bash, nhưng không thành công :(
lucacerone
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.