Tập tin lịch sử có thể được thống nhất trong bash?


35

Tôi thường xuyên chạy nhiều screenphiên trên máy tính để bàn và máy chủ Linux của mình.

Một vấn đề với điều này là khi tôi grepthông qua lịch sử lệnh của mình, tôi thấy tôi đã ban hành một lệnh trong một phiên khác và phải tách ra và đính kèm lại để có được mục lịch sử đó.

Có thể 'buộc' các lịch sử được cập nhật khác nhau từ nhiều phiên tới tất cả đi vào lịch sử trung tâm không?


Tôi gặp phải một vấn đề tương tự, theo đó tôi không thể xem lịch sử giữa các phiên cuối. Hóa ra tập tin ~ / .bash_history của tôi được sở hữu bởi root và không thể ghi được. Thay đổi chủ sở hữu / nhóm thành người dùng của tôi đã khắc phục sự cố: sudo chown <user>: <group> ~ / .bash_history
mateo

Câu trả lời:


41

Có hai điều bạn cần làm:

  1. Chèn lệnh shopt -s histappendtrong của bạn .bashrc. Điều này sẽ nối vào tệp lịch sử thay vì ghi đè lên nó.
  2. Cũng trong tệp của bạn .bashrc, chèn PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"và tệp lịch sử sẽ được viết lại và đọc lại mỗi lần bash hiển thị lời nhắc.

EDIT: Cảm ơn e-t172 về history -nmánh khóe


6
Cảm ơn vì điều đó. Tôi đã cải thiện nó hơn nữa bằng cách sử dụng PROMPT_COMMAND = "$ PROMPT_COMMAND; history -a; history -n". Bằng cách này, các lệnh được ban hành trong các phiên khác sẽ xuất hiện ngay lập tức trong lịch sử của phiên hiện tại (tốt, bạn cần nhấn Enter trước để cập nhật lịch sử).
Etienne Dechamp

8
Tôi đã không PROMPT_COMMANDxác định trước đó, vì vậy tôi phải sử dụng PROMPT_COMMAND="history -a; history -n"để tránh lỗi.
William Jackson

1
vui lòng xem câu trả lời superuser.com/a/734410/250287 để biết chính xác các lệnh -a, -c và -r.
mtd

Chỉ là một cảnh báo cho người mới: sau khi sử dụng viết lại lịch sử một thời gian, tôi nhận ra rằng tôi thường ban hành các lệnh sai; Khi bạn thấy trong dòng trước một số lệnh, bạn mong muốn mũi tên sẽ lặp lại và với cấu hình này, nó không còn luôn như vậy nữa.
Tiago

11

Vui lòng không sử dụng history -a; history -n, nó không hoạt động như bạn mong đợi và sẽ để lại cho bạn nhiều lệnh trùng lặp, không theo thứ tự trong lịch sử của bạn. Một giải pháp hoạt động chung như mong đợi là như sau:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Sử dụng một dòng mới thay vì dấu chấm phẩy cũng là một cách ngắn để xử lý vấn đề dấu chấm phẩy bị thiếu / trùng lặp với PROMPT_COMMAND.


history -a, -c, và sau đó -r là chính xác ... đây sẽ là câu trả lời được chấp nhận
mtd

1
Điều exportnày là không cần thiết. Bởi vì các tùy chọn shell tương tác được cho là được đặt từ ~/.bashrcđó được gọi từ mọi shell phụ, do đó không cần thiết kế thừa.
heo

Có một lý do tốt để không chỉ sử dụng PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"thay thế?
Sáu

Thứ tự đó sẽ yêu cầu một người lưu trữ giá trị thoát cuối cùng trước khi chạy các lệnh lịch sử, vì nhiều lệnh nhanh chóng dựa vào hoặc hiển thị nó.
Adam Crane

-1

PROMPT_COMMAND không được xác định theo mặc định trong một số bản phát hành. Ví dụ, nó được định nghĩa trong Arch, nhưng không phải trong Debian.

Tôi có một bashrc trong Dropbox mà tôi sử dụng trong khi phân phối nhảy và nó bao gồm:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

Một giải pháp khủng khiếp cho một vấn đề lập trình shell cơ bản. Đúng cách:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
Dolmen

Tốt hơn:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
heo
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.