Xóa N dòng cuối cùng khỏi lịch sử bash


40

Khi vô tình dán một tập tin vào vỏ, nó đặt một tấn các mục vô nghĩa xấu xí trong lịch sử bash. Có một cách sạch sẽ để loại bỏ những mục? Rõ ràng tôi có thể đóng shell và chỉnh sửa .bash_historytệp theo cách thủ công nhưng có thể có một số loại API có sẵn để sửa đổi lịch sử của shell hiện tại?

Câu trả lời:


36

Bạn có thể sử dụng history -d offsetnội dung để xóa một dòng cụ thể khỏi lịch sử của trình bao hiện tại hoặc history -cđể xóa toàn bộ lịch sử.

Nó không thực sự thiết thực nếu bạn muốn loại bỏ một loạt các dòng, vì nó chỉ lấy một phần bù làm đối số, nhưng bạn có thể bọc nó trong một hàm bằng một vòng lặp.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Gọi nó với rmhist first_line_to_delete last_line_to_delete. (Số dòng theo đầu ra của history.)

(Sử dụng history -wđể buộc ghi vào tệp lịch sử.)


1
Vì OP yêu cầu xóa N dòng cuối cùng , nên sửa đổi tập lệnh này bằng cách thực hiện một cái gì đó như: tot_lines=$(history | wc -l)và sau đó lặp lại history -d $(( tot_lines - $1 )).
PlasmaBinturong

2
Thay vì $(history | wc -l), có biến $HISTCMDcó thể được sử dụng.
PlasmaBinturong

29

Chỉ cần một lớp lót trong dấu nhắc lệnh này sẽ giúp.

for i in {1..N}; do history -d START_NUM; done

Trong đó START_NUM là vị trí bắt đầu của mục nhập trong lịch sử. N là số lượng mục bạn có thể muốn xóa.

Ví dụ: for i in {1..50}; do history -d 1030; done


3
Tôi tự hỏi tại sao đây không phải là một chức năng tích hợp sẵn. "Lịch sử" là một công cụ rất cũ.
Petr Gladkikh

Phục vụ mục đích rất tốt, nhưng lệnh này có thể được nhìn thấy trong lịch sử :)
Rajeev Akotkar

Askubfox.com/a/978276/22866 có một cách hay để xóa "lệnh xóa lịch sử" khỏi lịch sử :-)
HanSooloo

0

Câu trả lời của user2982704 gần như làm việc với tôi nhưng không hoàn toàn. Tôi đã phải thực hiện một biến thể nhỏ như thế này.

Giả sử lịch sử của tôi là 1000 và tôi muốn xóa 50 mục cuối cùng

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
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.