Làm thế nào để tôi đóng một thiết bị đầu cuối mà không lưu lịch sử?


33

Đã hơn một lần tôi vô tình chạy một số lệnh và làm ô nhiễm lịch sử bash của tôi. Làm cách nào để đóng thiết bị đầu cuối của tôi mà không lưu lịch sử bash của tôi? Tôi đang sử dụng Fedora.

Câu trả lời:


25

Lịch sử của shell của bạn được lưu trong tệp được chỉ định bởi HISTFILEbiến. Vì thế:

unset HISTFILE

Điều này cũng áp dụng cho zsh, nhưng không áp dụng cho ksh, lưu vào tệp được chỉ định $HISTFILEkhi shell bắt đầu (và ngược lại, bạn quyết định lưu lịch sử của mình trong ksh sau khi bạn khởi động shell).


Tôi có thể sử dụng điều này trước khi tôi đăng xuất sau khi tôi làm ô nhiễm lịch sử? và ust của nó cho phiên này? tôi không cần phải set HISTFILEđăng nhập lần sau? (chỉ cần nói nếu điều này đúng hoặc không chính xác)

@ acidzombie24 Điều đó là chính xác, các thay đổi đối với các biến môi trường không được lưu trong các phiên trừ khi bạn lưu trữ các thay đổi rõ ràng, ví dụ: trong các tệp RC.
jw013

31

Câu trả lời ngắn:

Nhập vào dấu nhắc này:

$ kill -9 $$

Điều này sẽ giết chết vỏ của bạn ngay lập tức mà không cần vỏ có thể làm bất cứ điều gì như bẫy tín hiệu, lưu lịch sử, thực thi ~/.bash_logout, cảnh báo về các công việc đã dừng hoặc bất kỳ công cụ tốt nào.

Câu trả lời dài:

Lưu ý: Các tùy chọn này không loại trừ lẫn nhau; tất cả chúng có thể được sử dụng cùng một lúc.

Lựa chọn 1:

Nếu bạn là người cầu toàn khi làm xáo trộn tập tin lịch sử của mình, thì điều bạn có thể làm là sửa đổi HISTIGNOREbiến để bao gồm các chuỗi lệnh bạn không muốn ghi lại. Chẳng hạn, nếu bạn thêm HISTIGNORE='ls*:cd*'vào ~/.bashrcthì bất kỳ trường hợp nào lscdkhông được chèn vào tệp lịch sử của bạn.

Lựa chọn 2:

Nếu bạn muốn điều khiển trên cơ sở từng lệnh, những lệnh nào bị bỏ lại trong lịch sử của bạn, bạn có thể đặt HISTCONTROL='ignorespace'sẽ bỏ qua bất kỳ dòng lệnh nào bắt đầu bằng khoảng trắng. Sử dụng ignorebothcũng sẽ bỏ qua các dòng lặp đi lặp lại. Sau đó, nhấn vào thanh dấu cách trước khi bạn nhập lệnh sẽ khiến nó không hiển thị trong tệp lịch sử của bạn.

Tùy chọn 3:

Nếu bạn chỉ muốn làm như vậy khi bạn đóng thiết bị đầu cuối, vỏ thoát ra ngay lập tức, bạn có thể trapbáo hiệu chương trình thiết bị đầu cuối gửi vỏ ( xtermví dụ gửi SIGHUPsau đó chờ vỏ thoát ra) và thực hiện thoát mà không lưu lịch sử khi nó nhận được tín hiệu này. Thêm phần này vào ~/.bashrc:

# don't record history when the window is closed
trap 'unset HISTFILE; exit' SIGHUP

2
+1 cho phương thức 'kill -9 $$'. Đó chắc chắn là một cách xoay quanh các tình huống trong đó HISTIGNORE, v.v. được đặt thành chỉ đọc.
Corey Henderson

7
Tôi không nghĩ nên khuyến khích sử dụng kill -9cho bất cứ điều gì ngoại trừ những tình huống thảm khốc khi mọi thứ khác đều thất bại.
Christoffer Hammarström

1
Gửi SIGKILL không bao giờ là một ý tưởng tốt như một quy trình vận hành tiêu chuẩn. Sử dụng các quy trình thích hợp, như bỏ đặt HISTFILE.
Arcege

@Arcege TMTOWTDI.
amphetamachine

Tôi muốn biết điều ngược lại - than ôi làm thế nào để giết bash để đảm bảo rằng nó sẽ lưu lại lịch sử của anh ấy - và điều này đã trả lời câu hỏi của tôi, cảm ơn.
mveroone

3

Tôi ngạc nhiên khi thấy không có ai đề nghị history -cngay trước đó exit. IINM (Tôi không phải là chuyên gia) sẽ làm tốt.


2
Bạn đang đi đúng hướng: history -rsẽ đọc lại tệp lịch sử, vì vậy việc lưu trở thành không có tác dụng.
Simon Richter

Lướt qua lịch sử là một thói quen xấu ... lịch sử vỏ chứa rất nhiều thông tin hữu ích về người đã làm gì. nó rất hữu ích cho những người mới trên nền tảng của bạn (trừ khi bạn tự tin 100% về tài liệu của mình, quản lý thay đổi)
Franklin Piat

2

Có hai biến môi trường mà bash sử dụng để xác định tệp lịch sử và có bao nhiêu dòng để ghi vào nó khi thoát khỏi trình bao.

Bạn có thể loại bỏ lịch sử phiên của mình bằng một trong hai thứ này (được đặt trong phiên bạn muốn bỏ qua khỏi tệp lịch sử của mình):

HISTFILE=/dev/null

hoặc là

HISTSIZE=0

Một trong số này hoạt động tốt trong Bash trên Fedora


1

Không chắc chắn tại sao bạn quan tâm đến lịch sử lệnh của bạn rất nhiều. Nếu bạn cần một số lệnh nhất định thường xuyên, bạn có thể vui hơn nếu bạn xác định bí danh cho chúng để bạn có thể lấy lại chúng bằng hai lần nhấn phím thay vì phải tìm chúng trong lịch sử.


0
  1. Eli đã cho bạn câu trả lời đúng cho Bash sắp đặt HISTSIZE=0.

  2. Tôi chỉ cần thêm phương thức để làm điều đó cho màn hình GNU . Nhấn Ctrl+A(trình tự thoát màn hình) theo sau :scrollback 0. Điều này sẽ xóa lịch sử cuộn lại. Bây giờ bạn có thể làm ngay lập tức :scrollback 15000để thiết lập lại kích thước bộ đệm cuộn lại.


Khi nào OP nói họ đang sử dụng screen(1)?
amphetamachine

Anh không làm thế. Tuy nhiên, bạn có thể đang chạy Bash trong một phiên màn hình và HISTSIZE = 0 vẫn sẽ để lại chi tiết hoạt động của bạn trong bộ đệm cuộn lại của màn hình. Vì vậy, nếu bạn thực sự muốn nó sạch sẽ, bạn cũng phải làm scrollback=0như vậy.
gsbabil

Bộ đệm cuộn được xóa khi cửa sổ đóng lại (tức là khi thoát khỏi vỏ). Nếu bạn gõ Ctrl-a H thì sao? Nó sẽ giết logfile?
amphetamachine

@amphetamachine: không, nó sẽ chỉ bắt đầu / kết thúc đăng nhập của cửa sổ hiện tại. Neighther Ctrl+a Hcũng Ctrl+a :clearsẽ không loại bỏ lịch sử. Bạn cần Ctrl+a :scrollback 0. Bạn có thể tự kiểm tra nó. Bắt đầu một phiên màn hình mới. Bây giờ làm a cat /etc/passwd. Bây giờ, làm bất kỳ điều nào ở trên - Ctrl+a Hhoặc Ctrl+a :clear. Bây giờ, hãy thử sao chép từ bộ đệm màn hình bằng cách Ctrl+a [bấm vào mũi tên theo sau để đi lên và xem bạn có thể đi bao xa để sao chép. Nếu bạn đã thực hiện Ctrl+a :scrollbacktheo sau bởi a clear, bạn sẽ chỉ đi xa như bạn có thể thấy trong cửa sổ hiện tại vì sẽ không có bất kỳ bộ đệm cuộn.
gsbabil
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.