Làm cách nào để tránh các mục trùng lặp trong .bash_history


108

Lệnh tương tự được liệt kê trong lịch sử của tôi nhiều lần. Làm thế nào tôi có thể tránh điều này? Tôi biết điều đó có thể thông qua HISTCONTROLnhưng tôi đã không tìm đúng cách.


Tôi đã tạo một câu hỏi có liên quan: askubfox.com/questions/205520/ . Dups trong lịch sử là hữu ích để xem bối cảnh của một lệnh. Những gì bạn muốn bỏ qua dups đôi khi khi bạn in lịch sử.
justingordon

Câu trả lời:


123

Từ bashtrang người đàn ông:

LỊCH SỬ

Một danh sách các giá trị được phân tách bằng dấu hai chấm kiểm soát cách các lệnh được lưu trong danh sách lịch sử. Nếu danh sách các giá trị bao gồm ignorespace, các dòng bắt đầu bằng ký tự khoảng trắng sẽ không được lưu trong danh sách lịch sử. Giá trị của các ignoredupsdòng nguyên nhân khớp với mục lịch sử trước đó sẽ không được lưu. Một giá trị ignorebothlà tốc ký cho ignorespaceignoredups. Giá trị củaerasedupslàm cho tất cả các dòng trước khớp với dòng hiện tại bị xóa khỏi danh sách lịch sử trước khi dòng đó được lưu. Bất kỳ giá trị không có trong danh sách trên được bỏ qua. Nếu HISTCONTROL không được đặt hoặc không bao gồm giá trị hợp lệ, tất cả các dòng được đọc bởi trình phân tích cú pháp shell được lưu trong danh sách lịch sử, tuân theo giá trị của HISTIGNORE. Các dòng thứ hai và tiếp theo của lệnh ghép nhiều dòng không được kiểm tra và được thêm vào lịch sử bất kể giá trị của HISTCONTROL.

Vì vậy, đặt dòng sau đây trong ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


Bạn có muốn tôi thêm HISTCONTROL = ignboth ở dưới cùng của ~ / .bashrc không?
karthick87

1
@karthick Không quan trọng bạn đặt nó ở đâu, dù sao thì cũng tốt.
Ê-sai

Ngày cài đặt của tôi về Ubuntu 12.04 Tôi bị buộc phải sửa đổi này trong ~/.bash_loginhầu hết thời gian nó sẽ có tác dụng nếu .bashrc được sửa đổi nhưng đó không phải là trường hợp tất cả các thời gian.
ck-

3
Đừng quên chạy chúng sau khi bạn cập nhật tệp bash profile / RC -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

Dán cái này trong ~/.bashrc:

export HISTCONTROL=ignoredups

Thay vào đó bạn có thể sử dụng ignoreboth. Điều này nó viết tắt cho cả hai ignorespaces(các lệnh bắt đầu bằng khoảng trắng) và ignoredups(trùng lặp).

Tôi thích ignoredupsbản thân mình hơn vì tôi thấy hành vi mặc định của việc bỏ qua các lệnh có khoảng trắng ở phía trước khá khó chịu khi tôi sao chép lệnh ra khỏi trang web và nó không được lưu vì tôi cũng vô tình sao chép vào một khoảng trắng .... Nhưng để mỗi người của họ.


3
Vẫn còn tồn tại trùng lặp .. Điều gì có thể là vấn đề ?? imgur.com/fXeLQ.png
karthick87

5
@ karthick87 trích dẫn từ một câu trả lời khác: Giá trị của các ignoredupsdòng nguyên nhân khớp với mục lịch sử trước đó không được lưu . Nó chỉ loại bỏ các dòng giống hệt nhau liên tiếp.
AL

10

Đưa điều này vào ~/.bashrcsẽ áp dụng giải pháp của @ alvin trong các phiên khác nhau dưới dạng wlell

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

Nguồn: Linux: Lịch sử Bash: Những người bị bỏ qua


Tại sao anh ta sử dụng export HISTCONTROLvà của bạn không? Có gì khác biệt? Nó hoạt động cho tôi mà không xuất khẩu, tôi chỉ tò mò
felwithe

1
Câu hỏi hay! Tôi cũng muốn biết câu trả lời. Nói chung exportlàm cho biến có sẵn cho các quy trình phụ. stackoverflow.com/q/1158091/552621 Trong trường hợp HISTCONTROL, PROMPT_COMMAND, vv, các biến này được sử dụng bởi các vỏ thân như vậy có lẽ xuất khẩu chúng (cho trẻ em xử lý) là không cần thiết.
Sói Nour


3

Thêm phần sau vào ~/.bashrc:

export HISTCONTROL=ignoredups

Để làm điều này, bạn có thể sử dụng lệnh này:

nano ~/.bashrc

0

Để đơn phương ghi lại mọi lệnh mới là khó khăn. Đầu tiên bạn cần thêm ~/.profilehoặc tương tự:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Sau đó, bạn cần thêm vào ~/.bash_logout:

history -a
history -w
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.