Làm thế nào để bash giữ các mục lịch sử được sử dụng thường xuyên nhất cho đến bao giờ?


5

Các bản sao đã bị tắt, nhưng điều đó là không đủ (tôi cảm thấy mình phải nhập lệnh quá thường xuyên).

Giả sử tôi có khả năng 2000 mục nhập theo bashlịch sử và một lệnh mà tôi đã sử dụng rất thường xuyên ( nlần) trong quá khứ nhưng không phải gần đây và tôi muốn sử dụng lại bây giờ. Giả sử lệnh này ở vị trí cũ nhất trong lịch sử và sẽ bị đuổi sau khi thực hiện lệnh không trùng lặp tiếp theo. Tôi muốn lệnh này được giữ nguyên và lệnh cũ nhất (với số lần sử dụng < n) sẽ bị đuổi khỏi lịch sử thay thế.

Người ta có thể lập luận rằng điều này làm cho bashlịch sử không còn là lịch sử (tuyến tính) nữa. Tôi đồng ý, nhưng không quan tâm vì tôi muốn truy cập dễ dàng vào các lệnh yêu thích của mình (được thu thập tự động).

Tôi đang sử dụng bash4.3.42 trên Ubuntu 15.10.


Không phải cái gì đó có thể dễ dàng thực hiện mà không sửa đổi mã nguồn thành Bash.
fpmurphy

Có, tôi có cùng một vấn đề vì vậy tôi luôn sao chép lệnh này bằng tay vào một tệp văn bản và sau đó sử dụng cat filenamelệnh sao chép và dán nó. Tôi làm thủ công vì vậy nếu bạn tìm thấy giải pháp, vui lòng cho chúng tôi biết
makgun

Câu trả lời:


4

Cảnh báo: Đây không phải là một câu trả lời cho câu hỏi như nó đứng, mà là một gợi ý cho một cách tiếp cận mà bạn có thể thấy hữu ích.

Tôi cảm nhận được nỗi đau của bạn. Tôi cũng muốn theo dõi lịch sử Bash của mình và có thể nhớ lại các lệnh mà tôi có thể đã chạy từ lâu. Tôi đã phát triển một cách tiếp cận cho phép tôi giữ tất cả lịch sử Bash của mình trong một kích thước lịch sử hợp lý.

  1. cài đặt lịch sử Bash của tôi là:

    HISTCONTROL=ignoreboth:erasedups
    HISTIGNORE="?:??:???:$HISTIGNORE"

    Điều đó giúp giữ các mục cuối trong lịch sử Bash ở vị trí đầu tiên. Các lệnh như lsngắn hơn để gõ hơn để gọi lại, vì vậy không có điểm nào trong việc lưu trữ chúng (đó là những gì HISTIGNOREdành cho). ignorebothlà tốc ký cho ignorespaceignoredups. Cái trước ngăn chặn các mục với một không gian hàng đầu kết thúc trong lịch sử. Tôi sử dụng nó cho các lệnh mà tôi biết tôi sẽ không bao giờ nhớ lại, hoặc không bao giờ muốn nhớ lại, như rm -rf *:). Có nhiều thứ nữa mà tôi bỏ qua theo mặc định (không hiển thị), giúp giảm kích thước lịch sử.

  2. Bất chấp các biện pháp đối phó ở trên, các bản sao vẫn kết thúc trong lịch sử của tôi (ví dụ: do nhiều vỏ Bash mở cùng một lúc). Tôi có một bộ đếm trong lời nhắc của tôi cho tôi thấy kích thước lịch sử hiện tại

    PS1='\u@\h:\w:\!> '

    (Mã liên quan là \!, hay còn gọi là số lịch sử của lệnh này .) Điều đó cho tôi biết khi đến lúc phải 'dọn dẹp' (xem bước tiếp theo).

  3. Tôi định kỳ 'dọn dẹp' lịch sử Bash của mình bằng cách chạy lệnh sau:

    tac ~/.bash_history | awk '!seen[$0]++' | tac > ~/.bash_history.new && mv ~/.bash_history.new ~/.bash_history

(giả sử lịch sử Bash của bạn được lưu trữ trong ~/.bash_historykhóa học). Lệnh này loại bỏ trùng lặp trong khi tuân thủ thứ tự: các lệnh được sử dụng cuối cùng vẫn còn cuối cùng. Chỉ có bản sao cuối cùng (gần đây nhất) được giữ lại.

Với cách tiếp cận này, tôi đã có thể giữ tất cả lịch sử Bash của mình trong một kích thước lịch sử rất khiêm tốn từ 600 đến 1000 mục.


Tôi đã hỏi meta.stackoverflow.com/questions/332134/ cho cách làm thế nào để có được không gian hàng đầu trong rm -rf *phần tử, chỉ vì tò mò.
Karl Richter

@KarlRichter thật hữu ích khi biết và có những lúc nó có thể được sử dụng tốt thực sự ;-) cảm ơn vì đã tìm kiếm điều này!
Edward
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.