Làm cách nào để dừng bash chỉnh sửa lịch sử khi tôi sử dụng lại và sửa đổi mục nhập?


20

Một số trường hợp bash thay đổi lịch sử lệnh khi bạn sử dụng lại và chỉnh sửa lệnh trước đó, những trường hợp khác dường như không. Tôi đã tìm kiếm và tìm kiếm nhưng không thể tìm thấy bất cứ điều gì nói cách ngăn các lệnh trong lịch sử bị sửa đổi khi chúng được sử dụng lại và chỉnh sửa.

Có những câu hỏi như thế này , nhưng dường như nói làm thế nào để đối phó với lịch sử đang được chỉnh sửa. Gần đây tôi chỉ bắt gặp một trường hợp bash có chỉnh sửa lịch sử khi bạn sử dụng lại lệnh - tất cả các bash shell trước đây tôi đã sử dụng (theo như tôi nhận thấy) đã được định cấu hình để không thay đổi lịch sử khi bạn sử dụng lại và chỉnh sửa một lệnh. (Có lẽ tôi đã không chú ý đúng mức đến lịch sử vỏ của mình trong 15 năm qua hoặc lâu hơn ...)

Vì vậy, đó có lẽ là câu hỏi hay nhất: Tôi có thể nói bash KHÔNG BAO GIỜ sửa đổi lịch sử - và nếu vậy, làm thế nào?


Bạn có thể sử dụng history -pđể thực hiện mở rộng lịch sử mà không ảnh hưởng đến tệp lịch sử. Bạn có thể làm history -sđể làm tương tự và nối thêm vào lịch sử mà không cần thực thi. Bạn có thể làm HISTIGNORE='start of a command I never want in history.*:command2.*'để giữ các lệnh nhất định ra khỏi lịch sử.
mikeerv

1
Không phải set revert-all-at-newline ontrong câu hỏi bạn liên kết giải quyết vấn đề của bạn? Bạn có thể chỉ ra cách tái tạo vấn đề? Lưu ý rằng bạn cũng có thể sử dụng zshcho một hành vi nội tuyến hơn với những gì bạn muốn.
Stéphane Chazelas

@mikeerv Nhìn vào trang người đàn ông, history -pcó phải tôi sẽ phải làm gì cho mọi lệnh mà tôi muốn sử dụng lại - đúng không? Nếu vậy, đó không hoàn toàn là những gì tôi đang tìm kiếm. Như tôi đã đề cập, tôi đã sử dụng các trường hợp bash không bao giờ sửa đổi lịch sử khi một lệnh được sử dụng lại và chỉnh sửa.
Richard Wiseman

@ StéphaneChazelas Không, tôi không nghĩ đó revert-all-at-newlinelà thứ tôi cần. Nếu tôi chỉnh sửa lệnh và nhấn CTRL-C để hủy lệnh, tôi cũng không muốn điều đó ảnh hưởng đến lịch sử. Trước đây tôi chưa bao giờ phải cấu hình bash để không sửa đổi lịch sử, đó là một phần lý do khiến tôi bối rối vì tại sao đôi khi một bản cài đặt mới lại hoạt động theo cách này và đôi khi theo cách khác. Nhân tiện, trong trường hợp không chỉnh sửa lịch sử sử dụng lại lệnh, một bind -V | grep revertdấu hiệu revert-all-at-newlineđược đặt thành 'tắt'.
Richard Wiseman

2
Trên thực tế điều này có rất ít để làm với bash. Đó là tất cả về readline. Có nhiều cách triển khai readlinethư viện khác nhau và nó cũng có một bộ cài đặt riêng (RẤT NHIỀU trong số chúng) và tệp cấu hình riêng. Tôi không chắc chắn chính xác nếu đây là một cài đặt hoặc chỉ đơn giản là một sự khác biệt triển khai, nhưng bạn nên tìm kiếm trong tài liệu liên quan đến đường đọc, không phải bash.
orion

Câu trả lời:


9

Hóa ra revert-all-at-newlinelà câu trả lời. Tôi cần đưa set revert-all-at-newline onvào ~/.inputrctệp của mình , vì sử dụng setlệnh tại dấu nhắc bash không có hiệu lực. (Sau đó, tất nhiên, tôi phải bắt đầu một lớp vỏ mới.)

Ngoài ra, tôi thấy rằng ~/.inputrcđược tải thay vì /etc/inputrc nếu có, điều đó có nghĩa là mọi giá trị mặc định được xác định trong phần sau không còn hoạt động khi bạn tạo ~/.inputrc. Để khắc phục điều này, hãy bắt đầu ~/.inputrcvới $include /etc/inputrc.

Cảm ơn @ StéphaneChazelas đã chỉ cho tôi đi đúng hướng.


0

Trong ~ / .bashrc bạn có thể thêm

shopt -s histappend

Cảm ơn, nhưng điều đó không ảnh hưởng đến vấn đề tôi đang gặp phải. Tôi vừa mới kiểm tra và histappendbật nhưng lịch sử của tôi vẫn hiển thị các chỉnh sửa cho các lệnh trước đó.
Richard Wiseman

Tôi đã tìm kiếm trang bash man và tôi đã tìm thấy các quy tắc cho lịch sử chỉnh sửa Readline Tên lệnh Nó khá mô tả nhưng tôi không thấy tùy chọn cho những gì bạn muốn ngoại trừ có thể: vẽ lại dòng hiện tại Làm mới dòng hiện tại hàng.
Jeff Coleman

Ngoài ra còn có một tùy chọn hoàn nguyên hoàn toàn mới mặc định tắt
Jeff Coleman
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.