Với BASH sau khi di chuyển, hãy di chuyển lên một lệnh trước đó, làm thế nào để chuyển sang tiếp theo trong lịch sử này?


59

Xin lỗi, danh hiệu này không phải là thứ thanh lịch nhất tôi từng nghĩ ra.

Nhưng tôi cho rằng nhiều người sẽ tự hỏi điều này và câu hỏi của tôi có thể là một bản sao ... tất cả những gì tôi có thể nói là tôi đã không tìm thấy nó.

Khi tôi nói "cuộn" lên, tôi có nghĩa là sử dụng phím "mũi tên lên" trên bàn phím, điều này rõ ràng sẽ cuộn bạn qua lịch sử, bắt đầu từ lệnh gần đây nhất.

Vì vậy, bạn tìm thấy một lệnh có thể 30 lệnh trở lại ... và bạn chạy nó. Và sau đó bạn muốn chạy lệnh ban đầu xuất hiện sau nó ... có cách nào hay không để làm điều này? Hoặc làm thế nào để những người thông thạo BASH làm điều này?

Câu trả lời:


96

Chạy lệnh với Ctrl+ othay vì Entersẽ chạy một lệnh từ lịch sử và sau đó xếp hàng tiếp theo thay vì quay lại phía trước lịch sử bash.


2
Tôi vừa thử cái này trong bash của riêng tôi chạy trong một xterm trên NetBSD, và nó không hoạt động! Có cài đặt nào có thể ảnh hưởng đến điều này? Tôi không có tập tin .inputrc. Co không được đề cập trong trang hướng dẫn cho readline (3).
Rhialto

@Rhialto Bạn đang sử dụng vichỉnh sửa dòng (được bật với set -o vi) hay emacs? Bởi vì Ctrl-Otôi sẽ không làm việc với người cũ như tôi có thể nói.
Lớp B

... nhưng điều này có thể được khắc phục bằng lệnh: bind "\C-o":operate-and-get-next(hoặc thêm mọi thứ sau bindvào ~/.inputrc)
B Layer

1
Tôi đã tìm ra vấn đề của mình là gì: ^ O được coi là ký tự Flush Output (không được hỗ trợ trên Linux) và readline không vô hiệu hóa điều này trong khi nó đang hoạt động. Tôi đã cung cấp một bản vá đơn giản nhưng bộ duy trì bash và readline duy trì rằng đây không phải là lỗi. Tôi không đồng ý. Xem danh sách.gnu.org/archive/html/orms
Rhialto

19

Câu trả lời của Jon Reinhold là tuyệt vời, nhưng có một giải pháp mạnh mẽ hơn nhiều mà tôi sẽ đề xuất. Tôi cũng có một nhận xét về một câu trả lời trong câu trả lời của Jon, nhưng tôi không đủ uy tín để có thể nhận xét trực tiếp, vì vậy @Jon Reinhold, nếu bạn đọc bài này, vui lòng gửi bình luận của tôi cho bạn bên dưới.

Bash bao gồm một lệnh fc, lấy số dòng tham số của danh sách lịch sử bash. Sau đó, nó sẽ mở trình soạn thảo mặc định của bạn với những dòng đó dưới dạng văn bản. Tại thời điểm đó, bạn có thể tùy ý chỉnh sửa các dòng. Sau đó, khi bạn thoát khỏi trình soạn thảo, bash sẽ thực thi các dòng đó!

Một ví dụ về chỉnh sửa mà bạn có thể muốn thực hiện là nối thêm tất cả trừ dòng cuối cùng như "; đọc -p" tiếp theo ... ". Điều đó sẽ khiến bash thực thi từng dòng và nhắc bạn trước khi tiếp tục.

Nhận xét cho Jon Reinhold: Câu trả lời tuyệt vời, nhưng bạn nên đủ điều kiện vì nếu người dùng đã đặt biến bash HISTCONTROL để bao gồm erasedups, thì sau khi thực hiện C-o, người dùng sẽ bị nhầm lẫn vì thay vì lệnh tiếp theo dự kiến ​​trong lịch sử được hiển thị, sau đó sẽ hiển thị sẽ được hiển thị. Điều này là do bash đã xóa phiên bản gốc của lệnh được thực thi, và do đó tất cả các lệnh sau đó đã chuyển lên một dòng, tức là. đến một số chỉ mục thấp hơn trong danh sách lịch sử.


cảm ơn, khi cố gắng tìm câu trả lời bằng cách tìm kiếm, tôi đã bắt gặp lệnh "fc". Đối với tôi, điều này thể hiện giai đoạn tiếp theo trong những bước đi chậm chạp của một người mới học BASH dọc theo con đường vinh quang hướng tới KIẾN THỨC. Tôi muốn bước đầu tiên của em bé.
mike gặm nhấm

3
@mikerodent số Vì vậy, nó sẽ xảy ra fcxảy ra trước cả Ctl-obashchính nó. (Trái ngược với câu trả lời này, nó cũng ít hữu ích hơn.)
kubanchot

1
Vấn đề với erasedupsrõ ràng là một lỗi bash (có thể đã có quy định cho tình huống này). Tốt để biết, mặc dù.
alexis

2
@kubanchot Đó là tranh luận. Nếu đó là một lệnh phức tạp, phức tạp tùy thuộc vào những gì cần sửa, nó sẽ nhanh hơn nhiều đối với tôi để sử dụng trình soạn thảo lựa chọn của mình để cập nhật lệnh. Nó cũng sẽ dễ dàng hơn.
Pryftan

14

Một cách khác để thực hiện hành vi mong muốn của bạn là làm quen với các phím tắt đọc bash (trong đó CTRL- olà một cách tôi tin) và tìm kiếm lịch sử bash.

Tìm kiếm lịch sử

CTRL- rđưa bạn vào tìm kiếm lịch sử lệnh bash, nơi bạn có thể bắt đầu nhập lệnh bạn đang tìm kiếm và bash sẽ tự động hoàn thành lệnh cho bạn. Các chức năng tự động hoàn thành là thực sự khá tốt. Khi lệnh bạn muốn chạy nằm trên dòng đầu vào, bạn có thể ENTERchạy lệnh hoặc nhấn CTRL- eđể di chuyển con trỏ đến cuối dòng lệnh và thoát khỏi chế độ tìm kiếm lịch sử.

Điều thú vị với CTRL- etại thời điểm này là bộ đệm lịch sử được đặt theo ngữ cảnh cho lệnh này. Các lệnh tiếp theo và trước đây bây giờ là các lệnh được chạy ngay trước và sau dòng tìm kiếm lịch sử dành cho bạn. Bạn có thể nhấn mũi tên lên hoặc xuống và lấy lệnh tiếp theo.

Tìm kiếm lịch sử rất mạnh mẽ và là một cách tuyệt vời để tránh sử dụng mũi tên lên để quay trở lại lệnh ngay từ đầu. Tìm kiếm lịch sử nhanh có thể tiết kiệm rất nhiều thời gian tìm kiếm thủ công trong suốt lịch sử và sau đó bạn có thể tiến hành CTRL- onhư Jon đã chỉ ra ở trên.

Đường cắt ngắn

Nếu bạn đang tìm kiếm để nâng cao tổng thể bash-fu của mình, tôi khuyên bạn nên cung cấp các phím tắt đọc cho các phím mũi tên. Bạn có thể thấy rằng chúng thuận tiện hơn và cho phép bạn tăng tốc độ gõ, nhưng tất nhiên là YMMV. Dưới đây là một vài chi tiết:

  1. CTRL- ncho lệnh tiếp theo (tương đương mũi tên xuống)
  2. CTRL- pcho lệnh trước (tương đương mũi tên lên)
  3. CTRL- btrở lại một ký tự (tương đương mũi tên trái)
  4. CTRL- fchuyển tiếp một ký tự (tương đương mũi tên phải)

Các phím tắt đọc này (cùng với CTRL- ađầu dòng và CTRL- ecuối dòng) sẽ tăng tốc độ và hiệu quả của bạn tại imo dòng lệnh.


2
Tôi không biết. Tôi thấy việc sử dụng các phím bổ trợ sẽ chậm hơn các mũi tên hoặc bất kỳ phím bấm đơn nào khác. Đối với EOL / vv. Tôi có xu hướng sử dụng các phím home / end (stty -a cũng hiển thị một số thứ khá tiện dụng).
Pryftan

@Pryftan Đủ công bằng, câu cuối cùng được trình bày dưới dạng ý kiến ​​(xem 'imo'). Tôi tin rằng việc ở trên hàng nhà của bàn phím trong một quãng đường dài là một chiến lược tốt để làm việc trong thiết bị đầu cuối hoặc bất kỳ tác vụ chuyên sâu nào khác. Một số người có bàn phím trong đó các phím mũi tên gần với các ký tự khác, trong trường hợp đó có lẽ các phím tắt đọc không phải là một tiện lợi hấp dẫn. Tôi sẽ chỉnh sửa câu trả lời để làm cho điểm cuối cùng này rõ ràng hơn một tuyên bố ý kiến.
111 ---

1
@datUser Tbh ​​Tôi đã bỏ lỡ 'imo' (hoặc nếu tôi không bỏ qua việc xem xét nó - hoàn toàn có thể). Điều đúng là tìm kiếm ngược là hữu ích (có +1) nếu nó hoạt động cho bạn. Tất nhiên fc cũng là một cái gì đó (như đã lưu ý) và đang sử dụng! (Vân vân.). Có rất nhiều cách để nuôi mèo trong Unices. Đối với bàn phím cũng khá đúng: Tôi có bàn phím Unicomp (thích nó và mang lại những ký ức) nhưng tất nhiên cũng có những bàn phím khác để xem xét không đề cập đến Dvorak. Cuối cùng, bạn càng có nhiều lựa chọn thì bạn càng có lợi và công việc (hoặc chơi) của bạn càng dễ dàng hơn :)
Pryftan
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.