Làm thế nào tôi có thể di chuyển xung quanh dòng lệnh bash một cách hiệu quả?


19

Vì vậy, tôi sử dụng upshell của mình (chủ yếu là Bash trên OSX hoặc Ubuntu) nhưng đôi khi tôi biết rằng tôi muốn các công cụ sau vị trí hiện tại của con trỏ. Có cách nào để dòng tôi hoàn thành với dòng trên không? Đánh upvà sau đó leftlà khó chịu.

Bất kỳ thủ thuật nào khác cũng sẽ rất tuyệt, ngoại trừ tab, tất cả chúng ta bây giờ về :)

Đây là một ví dụ (yêu cầu của per ~ quack):

Tôi gõ mkdir /where/the/hell/is/that/thingvà sau đó tôi muốn cd vào cùng một thư mục. Nhưng bây giờ tôi đã biết về meta-b :)


1
một ví dụ rõ ràng sẽ là tuyệt vời.
quack quixote

@ ~ quack làm ví dụ ngay bây giờ
Dan Rosenstark

1
đây là một câu hỏi liên quan (trùng lặp), với một câu trả lời khá hay: superuser.com/questions/124336/iêu
cregox

Câu trả lời:


11

Thử đi:

mkdir /where/the/hell/is/that/thing

sau đó nhấn alt+.

tùy thuộc vào hệ điều hành và thiết bị đầu cuối của bạn, bạn có thể phải gõ escsau đó.

Bạn cũng có thể nhấn alt+ 1+ .để chọn một đối số cụ thể trước đó.

Điều này tốt hơn nhiều so với !! hoặc! $ bởi vì bạn thực sự có thể thấy những gì bạn sắp chạy, và dù sao nó cũng mất ít lần nhấn phím hơn.

chỉnh sửa: nói đúng là metakhông phải alt, vì vậy nó cũng có thể hoạt động với phím "windows" tùy thuộc vào cách thiết lập bàn phím của bạn ..


hấp dẫn! không biết về điều đó.
quack quixote

2
@justin điều này thật tuyệt vời. Trên meta OSX là thoát.
Dan Rosenstark

@yar với OS X Terminal cũng có cài đặt tùy chọn trong 'Cài đặt' -> 'Bàn phím' để 'sử dụng tùy chọn làm khóa meta'.
ThomasW

Cảm ơn @ThomasW Tôi phải quay lại với công cụ này. Tôi đang trên dòng lệnh hàng ngày, nhưng sử dụng rất ít các thủ thuật.
Dan Rosenstark

28

Bạn nên đọc qua man bash trên hệ thống của mình, đặc biệt là phần trên Readline , vì đây là cơ chế nhập liệu tương tác của bash. Các nhãn hiệu Bash at gnu.org có một phần tốt đẹp trên dòng lệnh Biên tập sẽ giúp điền vào một số các khoảng trống.

Theo mặc định, bạn có thể sử dụng những thứ này để di chuyển trên dòng lệnh (chỉ liệt kê một vài ở đây; xem liên kết để biết danh sách đầy đủ):

  • Ctrl+ adi chuyển đến đầu dòng (hoặc Hometùy thuộc vào cài đặt thiết bị đầu cuối)
  • Ctrl+ edi chuyển đến cuối dòng (hoặc End...)
  • Meta+ fdi chuyển về phía trước một "từ"
  • Meta+ bdi chuyển ngược một "từ"

Bạn có thể sử dụng những văn bản này để "giết" (còn gọi là "cắt") từ một dòng:

  • Ctrl+ kgiết văn bản ("cắt") từ vị trí con trỏ hiện tại đến cuối dòng
  • Ctrl+ yyanks ("pastes") văn bản bị giết gần đây nhất trở lại bộ đệm tại con trỏ

Vì vậy, bạn có thể kết hợp những thứ này để chọn một đoạn của một số dòng lệnh bạn muốn lặp lại, giết nó, sau đó dán nó vào cuối lệnh tiếp theo của bạn.


Bây giờ, để làm cho nó thú vị hơn nữa, hãy xem xét Mở rộng Lịch sử của bash . Đây là !!rằng câu trả lời của Studer đề cập đến . Mở rộng lịch sử chia thành các nhà chỉ định sự kiện , người chỉ định từ và người sửa đổi .

Người chỉ định sự kiện trông như thế này (một lần nữa, xem các liên kết cho danh sách đầy đủ):

  • ! - bắt đầu thay thế lịch sử
  • !n- lệnh n-th trong danh sách lịch sử của bash, đối với một số số nguyên n (cũng hoạt động cho phủ định)
  • !!- lệnh tiến hành; tương đương với!-1
  • !string- lệnh gần đây nhất bắt đầu bằng chuỗi

Word chỉ định chọn một số phần nhất định từ một sự kiện. Sử dụng :để tách sự kiện từ người chỉ định từ. Các từ được đánh số từ 0 bắt đầu từ đầu dòng và được chèn vào dòng hiện tại cách nhau bởi các khoảng trắng.

  • $- chỉ định đối số cuối cùng (ví dụ: đối số !!:$cuối cùng của lệnh cuối cùng; có thể rút ngắn thành !$)
  • n- chỉ định từ thứ n (ví dụ: !str:2đối số thứ 2 của lệnh gần đây nhất bắt đầu bằng str ; !!:0lệnh của lệnh cuối cùng)

Vì vậy, để theo dõi ví dụ của bạn, nếu lệnh cuối cùng của bạn là mkdir /some/really/long/path, chỉ cần chạy !!sẽ chạy lại lệnh đó. Nhưng bạn muốn đi cdvào con đường đó thay vào đó:

$ cd !$

Bây giờ hãy giả sử bạn thực hiện một số lệnh khác và sau đó muốn quay lại đường dẫn đó một lần nữa. Nếu đó là lệnh mkdir cuối cùng bạn đã chạy, bạn có thể sử dụng lệnh này để lặp lại đường dẫn đó:

$ tar czf ~/foo.tgz !mkdir:$

bạn cũng có thể liên kết các lệnh này (và các lệnh Readline khác) với bất kỳ tổ hợp phím nào bạn thích; xem phần 8.4 của tài liệu hướng dẫn, các lệnh đọc có thể ràng buộc : gnu.org/software/bash/manual/ và phần 8.3, Tập tin khởi tạo Readline: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quack quixote

cảm ơn điều đó thực sự có ích Mặc dù "đọc hướng dẫn" là loại được mong đợi, nhưng đề cập đến việc di chuyển cơ bản xung quanh các ràng buộc sẽ giúp ích. Thậm chí chỉ cần biết ctrl-a có thể là tiết kiệm thực sự.
Dan Rosenstark

@quack, không vấn đề gì, thực tế tôi đã bắt gặp một bản sửa đổi sau này :)
Dan Rosenstark

1
cũng lưu ý bind -phoặc bind -Psẽ in keybindings hiện tại của bạn; đó là tài liệu tham khảo cuối cùng cho những gì bash của bạn sử dụng.
quack quixote

1
Tôi nghĩ rằng câu trả lời này đã phát triển: những thứ trên Lịch sử mở rộng là tuyệt vời.
Dan Rosenstark

6

Nếu bạn là người dùng vi, bạn có thể đặt shell vào chế độ vi bằng cách nhập set -o vi.

Sau đó, bạn có thể thực hiện tất cả các loại mạnh mẽ trên dòng lệnh sau khi gõ Esc + k.

Một tôi sử dụng nhiều nhất là Esc+Ksau đó /bất kỳ văn bản gõ sau dấu gạch chéo sẽ được sử dụng để tìm kiếm thông qua lịch sử dòng lệnh của bạn.

ví dụ: Esc + k /smbclient sẽ đưa ra lệnh smbclient cuối cùng mà bạn đã nhập. Bạn có thể cuộn qua tất cả các tìm kiếm bằng các phím vi tiêu chuẩn ( jkđể lên xuống nhưng tôi nghĩ mũi tên lên và xuống cũng sẽ hoạt động).

Trợ giúp thêm ở đây , cũng có một số điều bash sẵn có tại liên kết đó có thể là nhiều hơn những gì bạn đang tìm kiếm.

Chúc mừng, Stu.


trong khi chế độ vi là vô dụng đối với tôi, vì tôi chưa bước lên vi, mực l rất tuyệt vời. Cảm ơn vì điều đó!
Dan Rosenstark

1
Tương đương không có chế độ vi là ctrl-r. Nhập nó, và sau đó là một phần của lệnh trước đó. Nó sẽ đưa ra sự xuất hiện cuối cùng của những gì đã được gõ. Nhấn ctrl-r lần nữa để đến cái tiếp theo. Rất tiện dụng.
Nerdfest

3

Bạn có thể sử dụng !!đại diện cho lệnh cuối cùng:

% kiểm tra
% tiếng vang !!
> kiểm tra

hấp dẫn. Không chắc chắn rằng tôi muốn thao tác chuỗi đó bằng ... cái gì?
Dan Rosenstark

đây là một phần của các cơ sở lịch sử của bash: gnu.org/software/bash/manual/, .. đặc biệt là bản mở rộng lịch sử: gnu.org/software/bash/manual/bashref.html#History-Interaction ... lưu ý !!là một từ đồng nghĩa cho !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
quack quixote

2
Điều này thực sự hữu ích khi bạn quên sử dụng sudo: tức là sudo !! - $ more / etc / sudoers / etc / sudoers: Quyền bị từ chối $ sudo !! sudo thêm / etc / sudoers [sudo] mật khẩu cho ..: # / etc / sudoers ... ... ...
user9632

@wookiebreath, cảm ơn vì điều đó, tôi sẽ bỏ phiếu cho câu trả lời này ngay bây giờ
Dan Rosenstark

0

Trong ví dụ bạn đưa ra, hãy sử dụng! $ Để biểu thị tham số cuối cùng của lệnh trước đó:

mkdir / cái gì đó / cái gì đó

cd! $

Bạn cũng có thể sử dụng các biến thể được đánh số để lấy ra các tham số cụ thể của các lệnh trước đó.


0

Gần đây tôi thấy tờ cheat-sheet này rất hữu ích. Nhiều điều tôi không biết. Tôi đã từng sử dụng !$tất cả thời gian cho đến khi tôi phát hiện ra về Alt+ ., mà bây giờ tôi sử dụng tất cả thời gian. :)

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.