Làm thế nào tôi có thể nhận được một đối số cụ thể từ một lệnh trước trong bash?


31

Trong bash, bạn có thể sử dụng !*để lấy tất cả các đối số từ lệnh trước đó. Ví dụ, nếu bạn đã làm cp /some/path /some/other/pathvà sau đó đã làm mv !*, lệnh thứ hai sẽ được mở rộng thành mv /some/path /some/other/path.

Có bất cứ điều gì như thế này có thể được sử dụng để truy cập một đối số cụ thể từ một lệnh thay vì tất cả chúng không?

Câu trả lời:


38

Trong !*, !là tiền tố mở rộng lịch sử*từ chỉ định có nghĩa là tất cả các đối số. Bạn có thể ghi nhớ cú pháp chung dưới dạng cột bang-line-dấu hai chấm ( cột !dòng :). Có nhiều phím tắt có thể: dòng mặc định là dòng trước đó, bộ xác định cột mặc định là tất cả các dòng và bạn có thể bỏ dấu hai chấm nếu bộ xác định cột không phải là số (nhưng !3có nghĩa là dòng 3). Bạn có thể sử dụng !:0để tham khảo các tên lệnh, !:1, !:2, vv, để đề cập đến tranh cãi liên tiếp, !:$cho từ cuối cùng, !:*cho tất cả các đối số, và nhiều hơn nữa.

Xem thêm bài đăng này của Michael Mrozek tại Unix Stack Exchange .


1
Tôi đã thử bản thân mình và điều này đã không làm việc, tuy nhiên. Sau khi xem xét các bài bởi Michale Mrozek, nó nói đến việc sử dụng !:1, !:2. Sau khi sử dụng phiên bản với dấu hai chấm, nó đã hoạt động.
Wuffers

@MrMan: Rất tiếc, phải, nếu bạn bỏ dấu hai chấm bằng một số, số đó được hiểu là số dòng. Xin lỗi vì điều đó.
Gilles 'SO- ngừng trở nên xấu xa'

Không vấn đề gì. Vì vậy, sau đó tôi giả sử rằng làm !1:1sẽ chỉ đến đối số đầu tiên của dòng đầu tiên?
Wuffers

4

Cá nhân, tôi thực sự không thích bản mở rộng này với tính năng dấu chấm than, điều này thậm chí sẽ làm phiền nếu bạn thử echo "Hello World!"trong trình bao tương tác (vì vậy, các tập lệnh giả định rằng chúng sẽ được chạy ở chế độ không tương tác sẽ không hoạt động).

Vì vậy, tôi đã thiết lập set +o histexpandvà bắt đầu nhớ lại các đối số bằng phương thức sau:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Lưu ý rằng Esc-trick là vì tôi không có khóa meta.


Tôi gần như không bao giờ sử dụng dấu chấm than trong các lệnh. Vì vậy, phương pháp dấu chấm than hoạt động hoàn hảo đối với tôi.
Wuffers

Sau đó thưởng thức nó. Nhiều tính năng trong vỏ của bạn được thiết kế chỉ dành cho một vài người dùng.
Benoit

Trên thực tế, bạn không phải thoát khỏi dấu chấm than. Làm echo 'Hello, orld!'. Lưu ý các dấu ngoặc đơn thay vì dấu ngoặc kép.
Wuffers
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.