Điểm:16

Làm cách nào để chạy lại lệnh thứ hai đến cuối cùng?

lá cờ cn

Tôi đang sử dụng Ubuntu 21.10. Nếu tôi làm hỏng, tôi có thể chạy lại lệnh cuối cùng với !!. Đây là một ví dụ:

cập nhật $ apt
Đọc danh sách gói... Xong
E: Không thể mở tệp khóa /var/lib/apt/lists/lock - mở (13: Quyền bị từ chối)
E: Không thể khóa thư mục /var/lib/apt/lists/
W: Sự cố khi hủy liên kết tệp /var/cache/apt/pkgcache.bin - RemoveCaches (13: Quyền bị từ chối)
W: Sự cố khi hủy liên kết tệp /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Quyền bị từ chối)
$sudo!!
cập nhật sudo apt
[sudo] mật khẩu cho [tôi]:
...
Đã tải 336 kB trong 2 giây (206 kB/s)
Đọc danh sách gói... Xong
Xây dựng cây phụ thuộc
Đang đọc thông tin trạng thái... Xong
98 gói có thể được nâng cấp. Chạy 'apt list --upgradable' để xem chúng.

Điều đó tốt, nhưng thay vì chạy lại lệnh trước đó, làm thế nào tôi có thể chạy lệnh trước nó? Như thế này:

$ tiếng vang xin chào
Chào
$ tiếng vang xin chào
xin chào
$!! <- Tôi đang cố để nó chạy 'echo hi'
xin chào

Về cơ bản, đây là những gì tôi đang tìm kiếm

$ tiếng vang xin chào
Chào
$ tiếng vang xin chào
xin chào
$??? <- Tôi có thể đặt gì ở đây để chạy 'echo hi'?
lặp lại xin chào!
xin chào!

Vì vậy, cho rằng !! chạy lệnh cuối cùng, làm cách nào tôi có thể chạy lệnh trước lệnh trước? Trong ví dụ của tôi, thay vì gõ !!, tôi có thể chạy cái gì để thực thi lặp lại lời chào?

raj avatar
lá cờ cn
raj
Các phím tắt như `!!` rất hữu ích trong `sh` cũ đơn giản, nơi không có lịch sử lệnh và chỉnh sửa. Trong `bash`, bạn không cần sử dụng chúng nữa vì bạn có thể tự do chuyển đến các lệnh trước đó/tiếp theo bằng cách nhấn mũi tên lên/xuống.
bac0n avatar
lá cờ cn
`echo $(!-2)`, cũng có khả năng nhúng bộ chỉ định sự kiện.
lá cờ cg
Nếu bạn muốn chạy lệnh trước khi chạy lệnh trước đó, tôi khuyên bạn nên sử dụng tiện ích bổ sung cỗ máy thời gian để bash. Trong khi đó, nếu bạn muốn chạy lại lệnh trước đó, thì đó là một câu chuyện khác.
lá cờ cg
Có... "chạy lại lệnh trước lần cuối" hoặc "chạy lại lệnh thứ N từ lịch sử"
Itération 122442 avatar
lá cờ us
+1 vì bạn đã dạy tôi về !! :)
lá cờ br
JoL
@raj Đồng ý với bac0n, tôi cũng sử dụng chúng để nhúng. Đôi khi tôi chạy một lệnh, rồi một lệnh khác, sau đó tôi muốn so sánh các kết quả đầu ra và thực hiện điều gì đó như `diff -u
Peter - Reinstate Monica avatar
lá cờ hn
https://man7.org/linux/man-pages/man3/readline.3.html, Ctrl-F "Các lệnh để thao tác lịch sử"
Điểm:41
lá cờ au

Bạn có thể dùng mũi tên lênmũi tên xuống các phím để duyệt qua lịch sử lệnh của bạn. Vì vậy, để chạy lại lệnh cuối cùng thứ hai, bạn sẽ nhấn mũi tên lên hai lần, sau đó trở lại.

Điều này có một số lợi thế so với các phương pháp như !-2. Quan trọng nhất (theo ý kiến ​​​​của tôi), bạn có thể xem lệnh và đảm bảo rằng đó là lệnh bạn định chạy lại trước khi nhấn quay lại để thực thi. Ngay cả ngoài những lỗi đơn giản ("rất tiếc, tôi đoán đó là lệnh thứ ba mà tôi muốn"), lịch sử bash có thể không tính các lệnh trước đó theo cách bạn mong đợi vì các tùy chọn như bỏ qua không gian, bỏ qua, và KIỂM SOÁT LỊCH SỬ Biến đổi.

Ngoài ra, tính năng thu hồi lệnh tương tác cho phép bạn dễ dàng chỉnh sửa lệnh trước khi chạy lại. Bạn cũng có thể làm điều đó với các công cụ sửa đổi thu hồi lịch sử, nhưng thực hiện lại việc này một cách tương tác sẽ cho phép bạn xem các chỉnh sửa của mình trước khi thực hiện lệnh thu hồi/sửa đổi.

Ngoài ra, nếu bạn lười biếng như tôi, mũi tên lên mũi tên lên trở lại dễ gõ hơn (chuyển) câu cảm thán dấu trừ 2 trở lại

Quasímodo avatar
lá cờ jp
"Quan trọng nhất (theo ý kiến ​​​​của tôi), bạn có thể xem lệnh và đảm bảo rằng đó là lệnh bạn định chạy lại trước khi nhấn quay lại để thực thi nó." Nếu bạn bật `histverify` thì bất kỳ lệnh nào có thay thế lịch sử sẽ cần được xác nhận trước khi được trình bao phân tích cú pháp. Tuy nhiên, tôi cũng lười như bạn nên tôi sẽ ủng hộ đề xuất của bạn trong trường hợp cụ thể này.
Ruslan avatar
lá cờ bv
Nếu bạn thích giữ tay quanh hàng chính hơn là lang thang trên bàn phím, một tổ hợp dễ dàng hơn sẽ là Ctrl-P (ghi nhớ là "Trước đó") thay vì Mũi tên lên và Ctrl-N (đối với "Tiếp theo") thay vì Mũi tên xuống. Do đó, Ctrl-PP, Return.
Nate T avatar
lá cờ it
Với một nhược điểm lớn là thiếu kịch bản. Ít nhất là trong bất kỳ hình thức hợp lý.
Akbarkhon Variskhanov avatar
lá cờ mx
Bạn cũng có thể nhấn M-^ (tức là Alt+Shift+6 hoặc ESC Shift+6) để bắt đầu mở rộng lịch sử trên dòng hiện tại.
Điểm:35
lá cờ hr

Từ MỞ RỘNG LỊCH SỬ phần của người đàn ông bash:

!-n Tham khảo lệnh hiện tại trừ n

Vì vậy, để chạy lệnh trước lần cuối, bạn có thể sử dụng !-2

Trong thực tế, !! chỉ là một từ đồng nghĩa của !-1

lá cờ tw
Ý bạn là các nhà khoa học máy tính bắt đầu đếm từ 0 khi đi tiếp, nhưng từ -1 khi đi lùi? Những mọt sách này đã học đếm ở đâu?
SusanW avatar
lá cờ in
@MikeMaxwell hẳn chỉ là một sự châm biếm của lịch sử :-D
OmarL avatar
lá cờ sy
@MikeMaxwell, trong trường hợp này, 0 là số bạn hiện đang nhập; -1 là lệnh trước, -2 là lệnh trước nhưng một. Nó có ý nghĩa với tôi :-)
HiddenWindshield avatar
lá cờ us
@OmarL Vì vậy, nếu lệnh tiếp theo tôi sắp gõ sẽ là `echo "Thị trường chứng khoán sẽ là X"` sau hai giờ nữa, điều đó có nghĩa là tôi có thể sử dụng `!1` để xem giá cổ phiếu là bao nhiêu thị trường sẽ là hai giờ kể từ bây giờ?
OmarL avatar
lá cờ sy
@HiddenWindshield Đó là ... sáng tạo, nhưng không có xúc xắc: `-bash: !1: không tìm thấy sự kiện`
Điểm:7
lá cờ tz

!-N thực hiện lệnh "-n" trong lịch sử của bạn, nhưng tôi không khuyên bạn nên làm như vậy, vì nó là "ngay lập tức" và sẽ không cho bạn thời gian để kiểm tra trước xem lệnh "thứ N" có phải là lệnh phù hợp mà bạn cần thực hiện lại hay không.. .( @bac0n đã nhận xét rất hay rằng bạn có thể đặt : shopt -s xác minh lịch sử để chuyển nó thành "không tức thì": nó sẽ cho phép bạn xác minh lệnh !-n mở rộng thành, trước khi thực hiện nó với <Enter>)

Tuy nhiên, nếu bạn đang sử dụng đánh đập với tư cách là trình bao của bạn, tôi rất muốn khuyên bạn nên sử dụng tính năng tìm kiếm:

Điều khiển và sau đó gõ thứ gì đó, đây là một phần của lệnh mà bạn đang tìm kiếm. (Ví dụ: Điều khiển + r + (gõ vào thiết bị đầu cuối) tiếng vang)

Nó sẽ trình bày lần xuất hiện mới nhất trong lịch sử khớp của bạn thứ gì đó (nghĩa là khớp với cụm từ tìm kiếm mà bạn đã nhập sau Điều khiển + r).

Tiếp theo Điều khiển + r sẽ nhìn xa hơn trong lịch sử của bạn. Hoặc thêm các chữ cái sẽ chính xác tìm kiếm.

Và khi bạn tìm thấy một kết quả phù hợp, hãy nhấn đi vào để thực hiện lại nó (hoặc Điều khiển + c để thoát khỏi tìm kiếm mà không thực hiện lệnh khớp đang được hiển thị).

Mẹo bổ sung: nếu, thay vì đi vào , bạn nhấn Điều khiển + o , nó sẽ thực thi lệnh lịch sử đã chọn VÀ hiển thị lệnh tiếp theo, sẵn sàng để được thực thi với đi vào (chỉ thực hiện cái đó và quay lại dấu nhắc bình thường) hoặc Điều khiển + o một lần nữa (thực thi nó và hiển thị lệnh tiếp theo trong lịch sử của bạn). Rất hữu ích để lặp lại một chuỗi các bước và hiển thị các lệnh đó trước khi thực hiện chúng.

Và mỗi lần bạn sử dụng những thứ đó, bạn được phép thay đổi thứ gì đó trên dòng đang hiển thị (dùng phím mũi tên trái hoặc phải để di chuyển trong đó), chẳng hạn như tham số, tên máy chủ, v.v. và thực hiện dòng đã sửa đổi đó + đi tới cái tiếp theo (nếu bạn nhấn Điều khiển + o).

bac0n avatar
lá cờ cn
Nó phụ thuộc vào cách bạn thiết lập tùy chọn trình bao... bạn có thể nối thêm `shopt -s histverify` nếu bạn không muốn chạy mục nhập trực tiếp.
Nate T avatar
lá cờ it
Ngoài ra, bạn có thể thêm rằng đây là bash cụ thể. Hầu hết các trình bao hiện đại đều có lịch sử theo dõi/chạy lại ở dạng này hay dạng khác, nhưng cách triển khai và cú pháp/phím tắt sẽ khác nhau giữa các trình bao tiếp theo.
lá cờ tz
cảm ơn @NateT và bac0n, 2 điểm tốt mà tôi đã bỏ qua trong câu trả lời của mình. Tôi đã chỉnh sửa nó trong.
Ruslan avatar
lá cờ bv
Để bổ sung Ctrl-R cho `reverse-i-search`, có Ctrl-S để chuyển tiếp `i-search` (hữu ích khi bạn bỏ lỡ mục nhập bên phải và cần "quay lại"), mặc dù có [báo trước](https ://stackoverflow.com/q/791765/673852).
lá cờ tz
@Ruslan thêm một điều thú vị, nhưng tôi không bận tâm thêm điều đó vì nó ít được sử dụng hơn và đôi khi nó được liên kết với những thứ khác (ctrl-s [dừng thiết bị đầu cuối xuất ký tự] ctrl-q [tiếp tục ký tự đầu ra], ví dụ, theo mặc định trong nhiều shell. Xem https://unix.stackexchange.com/a/72092/27616 ). Một số cài đặt bổ sung (của readline? và stty) có thể được yêu cầu để thiết lập tất cả hoạt động và có thể tìm thấy các ví dụ trên unix.se
Ruslan avatar
lá cờ bv
@OlivierDulac đó chính xác là lời cảnh báo mà liên kết của tôi đề cập đến :)
lá cờ tz
@Ruslan: rất tiếc, không để ý cái đó, xin lỗi ^^
Điểm:4
lá cờ cn

Nếu bạn chạy

Môn lịch sử

bạn sẽ nhận được một danh sách các lệnh 'n' cuối cùng được nhập. Kích thước lịch sử mặc định là 500 lệnh. Vì vậy, như được giải thích bởi steeldriver, lệnh trước lệnh cuối cùng có thể được chạy lại với

!-2

và vâng, thứ ba đến cuối cùng sẽ là

!-3

và như thế. Để biết thêm chi tiết, sử dụng

lịch sử đàn ông

và tìm kiếm Người chỉ định sự kiện.

kopaka avatar
lá cờ cn
Một bổ sung nhỏ: bạn có thể chạy một lệnh cụ thể từ lịch sử chỉ bằng cách sử dụng `!312` (để chạy lệnh có số dòng 312 được hiển thị trong đầu ra lịch sử của bạn). Mẹo hữu ích hơn nữa: Nếu bạn mắc lỗi đánh máy trong lệnh đó, bạn có thể chạy lệnh `!312:p`. Thao tác này sẽ không thực thi lệnh nhưng vẫn đặt nó lên đầu là "lệnh được sử dụng lần cuối". Điều này giúp bạn chỉnh sửa các lệnh dài hơn mà không cần sao chép-dán thủ công từ lịch sử bằng cách chỉ cần sử dụng mũi tên lên và chỉnh sửa lệnh trước khi chạy.
Latkar avatar
lá cờ cn
Tuyệt quá! Danh sách các sửa đổi của "lịch sử" đầy bất ngờ. Cảm ơn!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.