Hiểu dấu chấm than (!) Trong bash


108

Tôi đã sử dụng

history | less

để có được các dòng của các lệnh trước đó và từ các số ở phía bên trái, tôi đã tìm thấy dòng tôi muốn lặp lại (ví dụ: 22) và đã làm

!22

tại dấu nhắc lệnh và nó đã hoạt động - thực thi tập lệnh trên dòng tôi đã làm lúc đó. Tôi không thể tìm ra dấu chấm than được sử dụng ở đâu, nó thể hiện điều gì về các hành động được thực hiện bởi bash và nơi sử dụng nó. Từ tài liệu tôi không thấy một lời giải thích nào là "hữu hình".



9
Không phải là câu trả lời cho câu hỏi của bạn, nhưng <ctrl> + R sẽ cho phép bạn tương tác tìm kiếm lịch sử của bạn và sau đó thực hiện ngay lập tức nếu bạn tìm thấy những gì bạn đang tìm kiếm.
kasterma

Câu trả lời:


144

!là một tính năng ban đầu xuất hiện trong trình bao C , trở lại vào những ngày trước khi bạn có thể tin tưởng vào các thiết bị đầu cuối để có các phím mũi tên. Nó đặc biệt hữu ích nếu bạn thêm số lệnh hiện tại vào dấu nhắc ( PS1="\!$ ") để bạn có thể nhanh chóng nhìn vào màn hình của mình để lấy số cho các lệnh trong quá khứ.

Bây giờ bạn có thể sử dụng các phím mũi tên và những thứ như Ctrl-Rtìm kiếm lịch sử lệnh, tôi không thấy sử dụng nhiều cho tính năng này.

Một biến thể của nó bạn vẫn có thể thấy hữu ích là !!, nó thực hiện lại lệnh trước đó. Về bản thân, tôi không tìm thấy !!Enterbất kỳ nhanh hơn chỉ Enter, nhưng nó có thể hữu ích khi kết hợp thành một lệnh lớn hơn.

Ví dụ: Một lỗi thí điểm phổ biến trên sudocác hệ thống dựa trên là quên sudotiền tố trên một lệnh yêu cầu thêm đặc quyền. Một người mới làm lại toàn bộ lệnh. Học sinh siêng năng chỉnh sửa lệnh từ lịch sử lệnh của shell. Các giác ngộ một loại sudo !!.

Bash cho phép bạn vô hiệu hóa !xử lý trong trình bao với set +o histexpandhoặc set +H. Bạn có thể vô hiệu hóa nó trong Zsh với set -K.


4
Tôi thấy Ctrl-P Ctrl-J khá nhanh; nhanh hơn Up Enter, ít nhất.
ephemient

24
Nếu bạn chỉ muốn chạy lệnh cuối cùng, Up / Enter vẫn ổn, nhưng nếu bạn muốn thêm vào nó theo một cách nào đó (giả sử, bạn đã quên sudo, hoặc một cái gì đó), thì bạn có thể làm sudo !!, chẳng hạn. Điều đó có thể nhanh hơn một chút so với "Up / Ctrl-A (hoặc Home, nếu bạn đủ may mắn) / sudo / space / enter". YMMV. :)

1
@AquariusPower: Chỉ cần trích dẫn nó. Dù echo 'Hi!'hay echo "Hi!"hay echo Hi\!. Tất cả đều làm điều tương tự.
Warren Young

1
setopt NO_BANG_HISTtrong zsh có thể đáng nhớ hơn -K.
phái

48

Nếu không có câu trả lời dài hơn ở đây thì chắc chắn có một câu trả lời về Siêu người dùng, vì tôi đã đọc một câu gần đây. Trong trang bash man, bạn có thể tìm thấy một phần rất lớn có tiêu đề MỞ RỘNG LỊCH SỬ về vấn đề này.

Bạn có thể thực hiện toàn bộ máy chủ hơn là chỉ chạy lệnh cuối hoặc số lệnh X. Bạn có thể thực hiện những việc như !catchạy lệnh cuối cùng bắt đầu bằng cat. Hoặc !?bash?:s/bash/csh/chạy lệnh cuối cùng chứa bashnhưng thay thế nó bằng csh.


3
Mặc dù không trực tiếp trả lời cho câu hỏi của OP, nhưng điều này cần nhiều cách nâng cao hơn. Rất hữu ích! Cảm ơn, Havok.
malvim

Uh, tôi thực sự nên nhìn vào trang người đàn ông trước khi tôi bắt đầu googling.
erikbwork

1
!!:s/bash/csh/thực sự chạy lệnh cuối cùng , sau đó thay thế bash bằng csh, nếu có. Không phải lệnh cuối cùng bao gồm bash. Đó sẽ là !?bash?:s/bash/csh/hoặc có thể!?bash?:s/%/csh/
cde

Đã sử dụng Bash rộng rãi trong vài năm, tôi đã bị sốc khi thấy rằng tôi chưa bao giờ biết về từ khóa này trước đây và mặc dù tôi đã dành hàng giờ đồng hồ lướt qua các mantrang, tính năng này rất khó hiểu. Cảm ơn bạn đã chỉ ra phần có liên quan - đó là nơi duy nhất trong các tài liệu thực tế nơi họ giải thích nó đầy đủ.
Steve Benner

39

Nhiều hơn nữa có thể được thực hiện với !như:

  • thực hiện một lệnh được gõ trước 3 lệnh: !-3
  • thực hiện một lệnh bắt đầu bằng !ls

và còn nhiều nữa. Xem 15 ví dụ mở rộng lịch sử Linux Bash bạn nên biết


Nâng cao điều này. Không có câu trả lời nào khác có bất kỳ thủ thuật thông minh nào trong số này.
Gergely Lukacsy

Được nâng cấp bởi vì www.thegeek ware.com đơn giản là một tài nguyên tuyệt vời và đây là một trong số ít các bài viết linux tôi chưa từng thấy trước đây. Rất hữu ích.
Steve Benner

4

Một người bạn của tôi đã gửi email cho tôi điều này:

Đây là một phần của thư viện lịch sử GNU. Trong bash, nó được sử dụng để chạy lại các lệnh trong lịch sử của bạn. Nếu bạn muốn trở thành người khó tính, hãy grep cho history_Exansion_char trong bash-4.1 / lib / readline / histExand.c để biết chi tiết triển khai.


3

Tất nhiên bạn có thể làm !!để sử dụng lại lệnh cuối cùng trong bash shell. Và sau đó là !$sử dụng lại phần cuối cùng của lệnh cuối cùng của bạn.

ví dụ xem một số tập tin

less path/to/your/file.txt

Nếu bây giờ bạn muốn chỉnh sửa cùng một tệp, bạn có thể sử dụng !$để chỉ nhận đường dẫn tệp từ lệnh cuối cùng

vim !$

1
Ah, tôi đã hy vọng tìm thấy điều này. Làm thế nào để nó cư xử với hai đối số?
Jonathan

Nó sẽ chỉ sử dụng lại cuộc tranh luận cuối cùng của hai người. $touch f1 f2và sau đó $vim !$sẽ đánh giá$vim f2
Teshan Shanuka J
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.