Có một phím tắt để lặp lại lệnh proximate thứ hai trong bash không?


8

Chúng ta đều biết rằng !!có thể lặp lại lệnh cuối cùng bạn làm trong bash.

Nhưng đôi khi chúng ta cần thực hiện một số thao tác như

$ python test.py
$ vim test.py

$ python test.py # here is where I need to repeat the second proximate bash command

Tôi có thể sử dụng phím mũi tên lên để làm điều đó, nhưng điều đó đòi hỏi tôi phải di chuyển bàn tay phải của mình đến một vị trí không thoải mái. Vì vậy, tôi tự hỏi nếu có một lệnh mà !!sẽ làm việc?


Sử dụng Ctrl+Pở chế độ emacs (mặc định) hoặc kở chế độ vi nếu bạn không muốn với tới phím lên.
Stéphane Chazelas

Tôi thực sự viết cả hai lệnh trong một dòng như vim test.py && python test.pyđể tránh làm hỏng nhiều lệnh trong lịch sử, nhưng bạn có thể chỉ cần liên kết "\ep": previous-historytrong ~/.inputrcđể bạn có thể nhấn Alt + p thay vì phím lên.
tijagi

Câu trả lời:


5

Bạn có thể sử dụng !-2:

$ echo foo
foo
$ echo bar
bar
$ !-2
echo foo
foo

Điều đó có thể không giúp đỡ với tình huống tay phải của bạn.

Bạn cũng có thể sử dụng !stringtìm kiếm lịch sử cho loại trường hợp này:

$ python test.py
$ vim test.py
$ !py
python test.py # Printed, then run

Điều này có thể thuận tiện hơn để sử dụng. Nó sẽ chạy:

lệnh gần đây nhất trước vị trí hiện tại trong danh sách lịch sử bắt đầu bằng chuỗi .

Thậm chí chỉ cần !plàm việc. Bạn có thể sử dụng !?stringđể tìm kiếm toàn bộ dòng lệnh, thay vì chỉ bắt đầu.


Đó là điều tốt hơn nhiều! vì các phím mũi tên cần di chuyển toàn bộ cổ tay của bạn và! -2 chỉ yêu cầu cử động ngón tay, tuyệt vời, Michael. Wow, chỉ cần đọc phần thứ hai, đó là ngoài mong đợi của tôi. Bạn là một pháp sư!
Zen

Bạn cũng có thể thực hiện mở rộng lịch sử nhanh chóng trên những gì bạn đã nhập bằng cách sử dụng "lịch sử mở rộng dòng" Alt + ^ hoặc "shell-bung-line" của Alt + Ctrl + e (cũng là bí danh) để mở rộng chỉ định / sửa đổi và kiểm tra trước khi bạn nhấn Enter. Vì vậy, ví dụ, nếu bạn đã echo Hello World!quay lại bốn dòng trong lịch sử và gõ tiếng vang! -4 thì Alt- ^ bạn sẽ nhận được bản mở rộng !-4ngay lập tức và thấy tiếng vang Hello World được mở rộng và chờ đợi. Tìm hiểu thêm về những người chỉ định và sửa đổi trong trang man cho Bash tìm "Nhà thiết kế sự kiện" để bắt đầu.
ConceptRat

4
!-2

Nhiều niềm vui có sẵn. Giả sử bạn muốn tiếp tục vận hành trên một tệp (như trên, nơi bạn đang sử dụng test.txt, lặp đi lặp lại):

cp foo.py thing.py
edit $_
python $_
!-2
^thing^foo
  • Sao chép một tập tin hiện có vào thing.py
  • Chỉnh sửa (vim, emacs - mặc dù tại sao bạn đang sử dụng một dòng lệnh nếu bạn đang chạy Emacs-OS, tôi không biết) thing.py- từ cuối cùng trong dòng lệnh trước đó
  • python thing.py
  • Biên tập thing.py
  • Biên tập foo.py

Lịch sử thao túng là niềm vui như vậy. Hãy thử man history. Lưu ý rằng nhiệm vụ sử dụng lại lịch sử có thể dẫn đến việc nhập nhiều hơn so với lệnh. Sự thay thế lệnh cuối cùng, trong đó tôi thay thế điều khoản bằng foo.py là một ví dụ như vậy. Ít ký tự hơn chỉ cần gõ lệnh và tên. :)

Sự thay thế lịch sử cũng là lý do tại sao bạn nhận được tin nhắn lạ khi bạn thử:

$ echo "This is a disaster!"
-bash: !": event not found

Dấu chấm than đang được sử dụng như một tài liệu tham khảo lịch sử và nó không thể tìm thấy một lệnh trước đó với một trích dẫn kép.


Nhân tiện, nếu tôi có tiếng vang 'xxx', làm cách nào để thay thế từng 'x' thành 'y'?
Zen

Thay thế một chuỗi cho một chuỗi khác? Chỉ vậy thôi? !!:1gs/x/y/
JezC

Mặc dù về mặt cá nhân, tôi sẽ xem xét$(echo !! | sed -e s/x/y/g)
JezC

sử dụng sed sẽ quá vụng về, tôi có thể thêm một số tham số hoặc ký hiệu trong ^ x ^ y để thực hiện công việc đó không?
Zen
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.