Làm cách nào để ngăn các lệnh hiển thị trong lịch sử Bash?


93

Đôi khi, khi tôi chạy các lệnh như rm -rf XYZ, tôi không muốn điều này được ghi lại trong lịch sử Bash, vì tôi có thể vô tình chạy lại lệnh tương tự reverse-i-search. Có cách nào tốt để ngăn điều này xảy ra không?



Mặc dù bash có thể được sử dụng để viết các kịch bản shell (do đó lập trình), khía cạnh cụ thể này của nó hoàn toàn không liên quan gì đến lập trình (lịch sử là một thứ chỉ tương tác). Biểu quyết đóng.
paxdiablo

Câu trả lời:


110

Nếu bạn đã đặt HISTCONTROLbiến môi trường thành ignoreboth(thường được đặt theo mặc định), các lệnh có ký tự khoảng trắng ở đầu sẽ không được lưu trữ trong lịch sử (cũng như các bản sao).

Ví dụ:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

Đây là những gì man bashnói:

HISTCONTROL

Danh sách 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 trên 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ị ignoredupskhiến các dòng khớp với mục nhập lịch sử trước đó không được lưu. Giá trị của ignorebothlà viết tắt của ignorespaceignoredups. Một giá trị erasedupskhiến 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ị nào không có trong danh sách trên đều bị bỏ qua. Nếu HISTCONTROLkhông được đặt hoặc không bao gồm một 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ử, tùy thuộc vào giá trị củaHISTIGNORE. Các dòng thứ hai và các dòng 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.

Xem thêm:


51

Trong .bashrc / .bash_profile / của bạn, đặt ở bất cứ đâu bạn muốn export HISTIGNORE=' *'. Sau đó, chỉ cần bắt đầu bất kỳ lệnh nào bạn muốn bỏ qua với một dấu cách.

$ ls  # goes in history
$  ls # does not

4
Điều này phụ thuộc vào giá trị của HISTCONTROLbiến môi trường, không nhất thiết phải ignorespaceđược đặt.
sorpigal

3
Nếu HISTCONTROLchứa ignorespace, thực sự chỉ thừa khi đưa dấu `*` vào HISTIGNORE. Hai người hoạt động độc lập.
chepner 19/07/2013

22

Sử dụng tốt hơn HISTIGNOREnữa. Điều này cho phép bạn chỉ định một tập hợp các mẫu được bỏ qua (chẳng hạn như rm). Nó tốt hơn (tôi nghĩ) hơn là chỉ ghi tất cả lịch sử vào /dev/null.


À đúng rồi, quên về điều đó :)
Corey Henderson

13
kill -9 $$

Tôi biết rằng điều đó không phải là tốt nhất như các câu trả lời trước, nhưng điều này sẽ giết Bash shell hiện tại mà không lưu bất cứ thứ gì, hữu ích khi HISTCONTROL không được đặt theo mặc định, bạn quên đặt nó hoặc đơn giản là bạn quên đặt dấu cách ở đầu. và bạn vừa nhập một số mật khẩu và không muốn chúng tồn tại vĩnh viễn trong lịch sử.

Đây là cách nhanh chóng và những thứ như xóa tệp lịch sử không tốt bằng vì bạn cần phải thực hiện nó bên ngoài trình bao lưu lịch sử (đăng nhập với tư cách người dùng khác và sử dụng su / sudo, tạo công việc nền, v.v.)


8

Bạn có thể làm một trong hai việc:

export HISTFILE=/dev/null

Hoặc, bắt đầu lệnh bằng dấu cách.


5
một không gian trước đó là tuyệt vời
Eric Fortis

8
Một số người trong chúng ta nghĩ rằng các lệnh tự động bỏ qua có tiền tố là một dấu cách là một ý tưởng thực sự tồi và do đó không được ignorespaceđặt theo mặc định.
sorpigal

3
Thiết lập HISTFILEtheo cách này ngăn chặn việc lưu trữ bất kỳ lịch sử nào và không ngăn lệnh được thêm vào lịch sử trong bộ nhớ.
chepner

3

Hoặc là

unset HISTFILE

(tương tự như câu trả lời trước chỉ ngắn hơn: export HISTFILE = / dev / null)


1
Điều này chỉ ảnh hưởng đến lịch sử trên đĩa, không ảnh hưởng đến lịch sử trong bộ nhớ.
chepner

2

Khi khởi động shell, tôi xóa rõ ràng lịch sử khỏi các mục mà tôi không muốn ở đó. Ví dụ: tôi không muốn bất kỳ điều gì rm -rftrong lịch sử (đó là chấn thương sau khi xóa một thư mục chứa đầy kết quả được xử lý qua đêm, chỉ với một dấu Arrow-Up+ Enter:)

Tôi đặt đoạn mã sau vào tệp init của mình (hoạt động với .zshrc, cũng nên hoạt động với .bashrc)

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE
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.