Có cách nào để hoàn tác sửa đổi lịch sử bash không?


9

Bằng cách nhấn lên, tôi có thể đi qua các lệnh đã nhập trước đó. Mặc dù tôi đã nhận thấy rằng nếu tôi sửa đổi một trong số chúng, điều đó sẽ thay đổi lịch sử. Chẳng hạn, nếu tôi gõ:

echo a
echo b
echo c
[up][up][backspace]d[ctrl+c]

lịch sử bây giờ cho thấy rằng lệnh thứ hai là echo d, không echo b. Làm thế nào để tôi giữ đầu tiên echo btrong lịch sử?

Ví dụ, giả sử tôi chạy một lệnh thực sự dài, với rất nhiều tùy chọn. sau đó tôi muốn chạy lại nó, với một thay đổi nhỏ, vì vậy tôi quay lại lịch sử để tìm nó, thực hiện thay đổi, nhưng rồi nhận ra rằng thực sự tôi không cần phải chạy lại nó, chỉ cần nghĩ đến một lựa chọn khác để làm thay thế. sau đó, tôi muốn quay lại và nhắc nhở bản thân rằng lệnh tôi đã chạy là gì - nhưng chờ đã, lịch sử hiện đang hiển thị sai!

Điều này rất hiếm khi xảy ra, nhưng khi tôi thấy nó thực sự khó chịu. Có một số cách để tự động bảo tồn lịch sử ban đầu?


1
với historybạn có thể thấy tất cả các lệnh. Sau khi bạn có thể chọn những gì bạn cần. Bạn đang sử dụng vỏ nào?
Hastur

6
Tôi không thể tái tạo điều đó. Nếu tôi thay đổi c thành d, nhấn CTRL + C và nhấn [lên] lần nữa, nó vẫn báo echo c.
Martin von Wittich

Câu trả lời:


6

Cố gắng đưa vào của bạn ~/.inputrc

 set revert-all-at-newline on

Trong một số trường hợp, bạn có thể tìm thấy nó trong giá trị mặc định (Tắt).
Cần buộc readlinehoàn tác tất cả các thay đổi đối với các dòng lịch sử trước khi quay lại khi accept-lineđược thực thi. (thêm thông tin trong man bash).

Chỉnh sửa:
CTRL+cset revert-all-at-newline onhoạt động tốt kể từ đó bash-4.3.30.

# GNU bash, version 4.3.30(1)-release
# Emacs-mode

echo c
[up][backspace]d[Ctrl+c][up] # you should see echo c

Nhưng:

echo c
[up][backspace]d[down][Ctrl+r]echo[Ctrl+j][Ctrl+c][up] # you should see echo d

Đẹp, đây là giải pháp tốt hơn. Thật thú vị, CTRL-c thực sự sẽ khiến nó nhớ giá trị đã sửa đổi, mặc dù xóa hoàn toàn dòng hoặc mũi tên xuống và sau đó nhấn enter hoặc chạy lệnh khác sẽ khôi phục lịch sử.
Dean Serenevy

@DeanSerenevy: Cảm ơn tôi cũng thích cách giải quyết của bạn và tôi cũng bắt đầu sử dụng CTRL-a nano:-)
Hastur

4

Thông thường:

CTRL-a # ENTER

sẽ làm điều đó.

Lệnh ban đầu sẽ được ghi nhớ nếu bạn thực hiện lệnh đã sửa đổi. Tất nhiên, bạn không muốn thực sự thực thi, vì vậy bạn có thể nhận xét dòng này với #.

Trong ví dụ của bạn, sau đó bạn sẽ có trong lịch sử của mình: echo a, echo b, echo c, # echo d.


1
Bạn có thể nhấn alt-shift-3để nhận xét dòng lệnh hiện tại nếu bash của bạn đang sử dụng readline. /insert-commenttrong man 3 readline(hoặc man bash) để biết thêm trong thông tin.
cychoi 24/07/2015
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.