Sử dụng lịch sử cơ sở để nhận một lệnh trước đó, sao chép nó và sau đó 'chạy' nó nhưng với lệnh đã nhận xét


79

Chỉ là một câu hỏi để cải thiện bashkỹ năng của tôi . Tôi luôn làm điều này:

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

Sau đó, tôi có thể chạy lệnh lệnh mà tôi tìm thấy bằng cách thực hiện:

!123

Tuy nhiên, tôi thường muốn làm điều này:

some_long_command1foobar

Tức là thay đổi lệnh trước khi tôi chạy nó. Bạn có thể sử dụng bash để chạy lệnh này thay thế không:

#some_long_command1

vì vậy nó được bình luận.

Sau đó, tôi không phải sử dụng chuột để đánh dấu lệnh, chỉnh sửa nó và sau đó chạy nó (tôi có thể chỉ sử dụng bàn phím - nhanh hơn).

Tôi cho rằng tôi có thể viết một kịch bản để làm điều đó nhưng có thể đã có sẵn chức năng ở đâu đó ....?


6
Cách dễ nhất: đưa bind Space:magic-spacevào hồ sơ bash của bạn. Sau đó, nhấn Spacesẽ mở rộng !123thành some_long_command1.
Blaz

@courteous: Cảm ơn! Đó là một cái mới đối với tôi. Rất hữu dụng.
marlar

Câu trả lời:


140

Tôi đề nghị thay vì sử dụng lệnh history, bạn sử dụng ctrl+rvà bắt đầu nhập lệnh đó. Khi bạn nhấn một phím mũi tên như thể để sửa đổi nó, nó sẽ thoát khỏi nhận dạng tự động hoàn thành và sẽ cho phép bạn chỉnh sửa trước khi chạy.

CẬP NHẬT: ngoài ra, nếu bạn muốn chuyển qua các lệnh khác nhau có chứa chuỗi bạn vừa nhập, hãy tiếp tục nhấn ctrl+r


8
Nếu bạn sử dụng vi keybindings ( set -o vi), bạn cũng có thể sử dụng /để tìm kiếm lịch sử và chỉnh sửa nó.
William Pursell

1
Một tính năng mạnh mẽ hơn là cho phép nhập một phần lệnh hoặc một phần đường dẫn trong một lệnh, sau đó sử dụng các mũi tên để điều hướng lịch sử. Tìm kiếm các tùy chọn history-search-back, history-search-forward cho bash
DavidC

2
DavidC, tôi đã thấy những người khác làm điều này, nhưng nó không hiệu quả với tôi. Khi tôi nhập một vài ký tự đầu tiên của lệnh, sau đó tôi nhấn mũi tên lên, nó sẽ bỏ qua những gì tôi đang nhập và lướt qua lịch sử như thể tôi chưa gõ bất cứ thứ gì (mới nhất đến cũ nhất). Làm thế nào để bạn cấu hình trình bao của bạn để thực hiện điều này?
Daniel Watrous

1
Thật đáng buồn khi nút lên / xuống không cuộn qua các trận đấu mà thoát ra khỏi tìm kiếm ngay lập tức. Tôi sẽ thích nó hơn để cuộn qua các kết quả phù hợp với lên / xuống (cho biết rằng tôi vẫn đang tìm kiếm lệnh tôi muốn) và chỉ có lối ra trái / phải thoát khỏi tìm kiếm (cho biết rằng tôi đã tìm thấy lệnh tôi muốn và bây giờ tôi đã sẵn sàng để chỉnh sửa nó).
ADTC

3
@ADTC Tôi vừa tìm ra một cách để thực hiện những gì bạn (và tôi) muốn: nhấn ctr+r, bắt đầu nhập, sau đó khi bạn muốn tìm tất cả các lệnh có chứa điều đó, chỉ cần tiếp tục nhấn ctrl+r. Nói cách khác, những gì bạn muốn làm gì với lên / xuống được thực hiện (theo kiểu round robin) vớictrl+r
Miquel

61

Trên thực tế, bạn có thể chỉ cần thêm :plệnh để in nó mà không thực sự chạy nó. Ví dụ:

$ ls -la
$ !!:p

Sẽ in ra ls -lanhư lệnh trước đó mà không cần chạy nó và bạn chỉ cần nhấn (lên) để tìm và chỉnh sửa nó.

Bạn cũng có thể làm

!123:p

để in ra lệnh thứ 123 như lệnh trước của bạn.


2
+1 Câu trả lời hay nhất, vì nó cho phép các lệnh lịch sử thông thường trả lời OP : !mycmd:p. Nếu bạn đã bật lệnh vi trong Bash, thì câu trả lời của Pursell cũng tốt hoặc tốt hơn. Ctrl-r, như đã đề cập bởi Miquel là tốt nhất tiếp theo.
Brent Faust

Nếu 123 trong không ở khởi điểm của dòng bạn có thể làm: 123: p!?
Udi

19

Bạn cũng có thể thử fclệnh để chỉnh sửa lệnh trong lịch sử.

WIKI nói,

fc là một chương trình tiêu chuẩn trên Unix mà danh sách hoặc chỉnh sửa và reexecutes, lệnh trước đó nhập vào một vỏ tương tác. fc là một built-in lệnh trong bash shell; giúp fc sẽ hiển thị thông tin sử dụng.


Ngoài ngược gia tăng tìm kiếm ( Ctrl+ R), chúng tôi có một số chi tiết bash các phím tắt:

Từ man bash:

lịch sử trước đây (Cp)
    Tìm nạp lệnh trước đó từ danh sách lịch sử, di chuyển trở lại trong danh sách. 
lịch sử tiếp theo (Cn)
    Tìm nạp lệnh tiếp theo từ danh sách lịch sử, chuyển tiếp trong danh sách. 
sơ sử (M- <)
    Di chuyển đến dòng đầu tiên trong lịch sử. 
cuối lịch sử (M->)
    Di chuyển đến cuối lịch sử nhập, tức là dòng hiện đang được nhập. 
ngược lại lịch sử tìm kiếm (Cr)
    Tìm kiếm ngược lại bắt đầu từ dòng hiện tại và di chuyển 'lên' qua lịch sử nếu cần. Đây là một tìm kiếm gia tăng.
lịch sử tìm kiếm chuyển tiếp (Cs)
    Tìm kiếm về phía trước bắt đầu từ dòng hiện tại và di chuyển 'xuống dưới' qua lịch sử nếu cần. Đây là một tìm kiếm gia tăng.
lịch sử tìm kiếm không gia tăng-đảo ngược (Mp)
    Tìm kiếm ngược qua lịch sử bắt đầu từ dòng hiện tại bằng cách sử dụng tìm kiếm không tăng dần cho một chuỗi do người dùng cung cấp. 
lịch sử tìm kiếm không tăng dần (Mn)
    Tìm kiếm trong lịch sử bằng cách sử dụng tìm kiếm không gia tăng cho một chuỗi do người dùng cung cấp.
yank-nth-arg (MCy)
    Chèn đối số đầu tiên vào lệnh trước đó (thường là từ thứ hai trên dòng trước đó) tại điểm. Với đối số n, hãy chèn từ thứ n từ lệnh trước đó (các từ trong lệnh trước bắt đầu bằng từ 0). Đối số phủ định sẽ chèn từ thứ n vào cuối lệnh trước đó. Khi đối số n được tính toán, đối số được trích xuất như thể phần mở rộng lịch sử "! N" đã được chỉ định.
yank-last-arg (M-., M-_)
    Chèn đối số cuối cùng vào lệnh trước đó (từ cuối cùng của mục lịch sử trước đó). Với một đối số, hãy cư xử chính xác như yank-nth-arg. Các lệnh gọi liên tiếp đến yank-last-arg di chuyển trở lại danh sách lịch sử, lần lượt chèn đối số cuối cùng của mỗi dòng. Cơ sở mở rộng lịch sử được sử dụng để trích xuất đối số cuối cùng, như thể mở rộng lịch sử "! $" Đã được chỉ định.
shell-expand-line (MCe)
    Mở rộng dòng như shell. Điều này thực hiện mở rộng bí danh và lịch sử cũng như tất cả các mở rộng từ shell. Xem MỞ RỘNG LỊCH SỬ bên dưới để biết mô tả về mở rộng lịch sử.
history-expand-line (M- ^)
    Thực hiện mở rộng lịch sử trên dòng hiện tại. Xem MỞ RỘNG LỊCH SỬ bên dưới để biết mô tả về mở rộng lịch sử.
insert-last-đối số (M-., M-_)
    Một từ đồng nghĩa với yank-last-arg. 
hoạt động và nhận được tiếp theo (Co)
    Chấp nhận dòng hiện tại để thực thi và tìm nạp dòng tiếp theo liên quan đến dòng hiện tại từ lịch sử để chỉnh sửa. Mọi đối số đều bị bỏ qua.
sửa-và-thực hiện-lệnh (C-xC-e)
    Gọi một trình soạn thảo trên dòng lệnh hiện tại và thực thi kết quả dưới dạng các lệnh shell.

11
!123:gs/old/new/

Sẽ chạy lệnh 123 thay thế chuỗi 'cũ' bằng chuỗi 'mới'.


6

Bạn có thể chuyển sang chế độ chỉnh sửa bằng cách nhấn M- ^ (option-shift-6 trên mac).

Nhập cái này:

! 123M- ^

Và bạn sẽ chỉnh sửa lệnh # 123. Nó giống như sử dụng ctrl-r, nhưng bắt đầu bằng cú pháp dấu chấm than.


M-^thể liên kết lại với thứ gì đó thân thiện với ngón tay hơn không?
Blaz

4

Thay vì sử dụng historylệnh, hãy liên kết history-search-backward/ history-search-forwardvới các phím tắt có thể được nhớ dễ dàng (tôi thích PgUp / PgDown hơn). Để làm điều đó, hãy đưa cái này vào .inputrctệp của bạn :

"<key code>":  history-search-backward
"<key code>":  history-search-forward

Để lấy <key code>, hãy nhập Ctrl-V <key>shell và thay thế bắt đầu ^[bằng \ebất cứ thứ gì được xuất.

Sau khi thiết lập xong, bạn chỉ cần gõ somevà nhấn PgUp để nhận some_long_command. Nếu bạn cần some_long_command with_some_argnhưng có một lệnh tương tự some_long_command with_some_other_argsau này trong lịch sử, bạn có thể quay vòng cho đến khi đạt được lệnh đó bằng cách nhập somevà sau đó nhấn PgUp liên tục hoặc bạn có thể nhập some, nhấn PgUp, di chuyển con trỏ đến nơi hai lệnh bắt đầu khác nhau, nhập một vài ký tự và nhấn PgUp một lần nữa. Khả năng nhanh chóng lướt qua / phân biệt giữa các lệnh tương tự này làm cho nó theo ý kiến ​​của tôi là một công cụ thoải mái hơn nhiều Ctrl-R.


3

Bạn cũng có thể đặt

shopt -s histverify

trong của bạn .bash_profile, điều này khiến bất kỳ phần mở rộng lịch sử nào xuất hiện trên dòng lệnh của bạn mà không cần chạy nó, cho phép bạn chỉnh sửa trước khi thực hiện.


1

Bạn có thể thử lịch sử giống như "hộp đề xuất" https://github.com/dvorka/hstr - nó đọc lịch sử Bash và cho phép điều hướng nhanh chóng.

hh

Để nhận được lệnh cuối cùng, chỉ cần nhập hh, điều hướng đến lệnh và sử dụng mũi tên phải để đưa nó vào dòng lệnh (nơi bạn có thể chỉnh sửa và / hoặc thêm nhận xét).


0

^ p để nhận lệnh được nhập cuối cùng trong unix / solaris


0

Đặt

bí danh r = 'fc -s'

trong .bashrc(dir nhà riêng) của bạn thì bạn chỉ cần nhập vào

r <whatever>

tại dấu nhắc lệnh và bạn sẽ thực hiện một bản sao của <whatever>lệnh cuối cùng (cùng một tham số) có trong lịch sử của bạn. chỉ cần nhấn vào mũi tên lên để xem những gì bạn đã thực hiện nếu bạn cảm thấy cần thiết.

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.