Cách lặp lại lệnh với tham số đã thêm


7

Tôi biết làm thế nào để lặp lại một lệnh và thêm văn bản sau nó với !!như vậy:

ls -l
!! tmp

Dòng thứ hai mở rộng đến ls -l tmp.

Nhưng nếu tôi muốn thêm tham số vào lệnh ở giữa các từ thì sao? Ví dụ: nếu tôi đã làm như sau:

ls tmp

... sau đó tôi thường muốn thêm -ltham số vào lệnh nhưng không nhập lại toàn bộ hoặc nhấn và sử dụng các phím mũi tên để đặt con trỏ đến đúng vị trí. !! -lkhông hoạt động vì nó trở nên ls tmp -lkhông hợp lệ. (Trong thực tế, lệnh dài hơn nhiều so với ví dụ đơn giản tôi đã sử dụng ở đây.)

Nói cách khác Tôi đang tìm một cái gì đó giống như ?? -lnơi ??là cái gì đó lặp đi lặp lại lệnh trước đó nhưng thêm vào -lở giữa những lời đầu tiên và thứ hai.


Chỉ cần làm cho nó rõ ràng, ls -l tmpchỉ là một ví dụ đơn giản. Trường hợp sử dụng thực tế gần với một cái gì đó như /very/long/path/to/very-long-command --with=a --very=long --parameter=list.


2
Ví dụ, nó có thể là ^ ^ -l ^trao đổi spacecho space -l spacehoặc ^s^s -l^(nhưng ls tmp -lcũng hoàn toàn khả thi)
Costas

2
Hãy thử !!:0 -l /tmp. Ở đây 0có nghĩa là từ đầu tiên, tức là. lệnh chính nó. Tất nhiên bạn cũng có thể làm !!:0 -l !!:1nếu bạn không muốn lặp lại /tmp.
jimmij

Cả hai dường như làm việc. Bạn nên thêm chúng dưới dạng câu trả lời ...
Moyli

Câu trả lời:


3

!!:0là từ thứ 0 của lệnh trước đó và !!:*là tất cả các từ trừ số 0.

!!:0 -l !!:*

là lệnh bạn đang tìm kiếm.

Nguồn https://www.gnu.org/software/bash/manual/bash.html#Word-Designators


Điều này thực sự hữu ích cho tôi. Tôi sẽ thường cố kiểm tra một nhánh git mới, nhưng quên -bcờ mở một nhánh mới. Vì vậy, tôi có thể gõ ra git checkout whatever, để thêm vào -bcái tôi cần, tôi có thể làm điều này: !!- -b !$bởi vì !!-tất cả mọi thứ trừ từ cuối cùng, và !$là từ cuối cùng.
Darth Egregious

3

Bạn có thể:

$ ls -l
[..]
$ !:0* /tmp
[..]

Cái này sẽ gọi ls -l /tmp. Xem bashtrang hướng dẫn:

   Word Designators
       Word designators are used to select desired words from the event.  A : separates the 
       event specification from the  word  designator.   It  may  be  omitted  if the word
       designator begins with a ^, $, *, -, or %.  Words are numbered from the beginning of
       the line, with the first word being denoted by 0 (zero).  Words are inserted into the
       current line separated by single spaces.

       0 (zero)
              The zeroth word.  For the shell, this is the command word.
       n      The nth word.
       ^      The first argument.  That is, word 1.
       $      The last argument.
       %      The word matched by the most recent `?string?' search.
       x-y    A range of words; `-y' abbreviates `0-y'.
       *      All of the words but the zeroth.  This is a synonym for `1-$'.  It is not an 
              error to use * if there is just one  word  in
              the event; the empty string is returned in that case.
       x*     Abbreviates x-$.
       x-     Abbreviates x-$ like x*, but omits the last word.

       If a word designator is supplied without an event specification, the previous command
       is used as the event.

Tốt hơn để tham khảoman history
Costas

Điều này có vẻ đầy hứa hẹn, nhưng ví dụ là cách sai. Làm thế nào để bạn đi từ ls /tmpđến ls -l /tmp?
Moyli

1

Bash cho phép bạn thực hiện nhanh chóng tìm kiếm và lấy lại lời nhắc của bạn một lệnh từ lịch sử của bạn để sau đó bạn có thể chỉnh sửa nó bằng tay trước khi thực hiện nó.

Tại dấu nhắc:

  1. Nhấn Ctrl-R (như trong R everse): lời nhắc sẽ thay đổi để thông báo cho bạn rằng bạn hiện đang ở chế độ Đảo ngược,
  2. Bắt đầu gõ bất kỳ một phần của lệnh của bạn (trong ví dụ của bạn, bạn có thể gõ ls, tmphoặc thậm chí mpđể phù hợp ls tmp): các sử dụng lệnh cuối cùng phù hợp với nét chính của bạn sẽ được hiển thị khi bạn gõ.
  3. Khi bạn đã tìm thấy lệnh của mình, chỉ cần gõ tabđể nhận lệnh trong dấu nhắc thông thường của bạn: nó sẽ không được thực thi, nó sẽ ở đây chờ sửa đổi của bạn, ví dụ như bất kỳ bổ sung, xóa hoặc thay đổi tham số nào, hoặc áp dụng một lệnh khác để cùng một tập tin, vv

1
Nhấn Enter sẽ kích hoạt lệnh, ít nhất là trên hệ thống của tôi. Sử dụng Tab thay thế;)
John WH Smith

Cảm ơn, nhưng tôi đang tìm kiếm một cách không liên quan đến việc gõ lại lệnh.
Moyli

@JohnWHSmith: Cảm ơn, sai lầm được sửa chữa (tôi không có bất kỳ Bash tại hiện tay và cuối cùng nó chỉ trở thành một phản xạ vì vậy tôi sử dụng lịch sử mà không cần suy nghĩ mà chính thực tế tôi bấm :))
WhiteWinterWolf

@Moyli Bạn phải đạt được lệnh đúng bằng cách nào đó. Nếu đó là lần trước, chỉ cần nhấn Upthay vì gõ !!. Nếu đó là một lệnh trước đó, nhấn Ctrl+R foothay vì !foo(không hoàn toàn giống nhau nhưng đủ gần).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tiền đề là đó là lệnh ngay lập tức trước đó. Tôi đã đề cập đến tất cả những điều này trong câu hỏi, bao gồm cả việc tôi đang tìm kiếm một cách không liên quan đến việc gõ lại hoặc di chuyển xung quanh bằng các phím con trỏ. Câu trả lời khác chỉ ra (gần như) cách thực hiện mà không cần gõ lại lệnh.
Moyli

0

Để khởi chạy lệnh trước đó với một tùy chọn được thêm ngay sau tên lệnh, hãy bấm các phím sau:
Up Home Ctrl+ Right Space(nhập tùy chọn)Enter

Nếu các phím con trỏ không hoạt động trên hệ thống của bạn, bạn có thể sử dụng các phím chuyển động Emacs thay thế:
Ctrl+ P Ctrl+ A Meta+ F Space(nhập tùy chọn)Enter

Nếu tên lệnh có nhiều từ (ví dụ: vì đó là đường dẫn có dấu gạch chéo), Ctrl+ Rightchỉ di chuyển qua dấu gạch chéo đầu tiên. Tìm kiếm không gian đầu tiên thay thế.

Up Home Ctrl+ S Space Esc Space(nhập tùy chọn) Enter
Ctrl+ P Ctrl+ A Ctrl+ S Space Esc Space(nhập tùy chọn)Enter

Với tìm kiếm này, bạn có thể bắt đầu bằng Up Upthay vì Up Homehoặc Ctrl+ P Ctrl+ Pthay vì Ctrl+ P Ctrl+ A. Số lần nhấn phím là như nhau, nhưng cách gõ dễ hơn một chút nhưng ít trực quan hơn.

Nếu bạn thích, bạn có thể sử dụng tiện ích thay thế lịch sử , bao gồm ít lần nhấn phím hơn nếu lệnh chứa dấu gạch chéo.
^ ^ --option 
Lưu ý khoảng trắng theo sau tùy chọn: bạn đang thay thế khoảng trắng đầu tiên trong lệnh bằng khoảng trắng, tùy chọn mới và khoảng trắng khác.

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.