Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Thành Thạo Mở Rộng Lịch Sử Bash: 15 Lệnh Cần Thiết Tăng Năng Suất

Thành Thạo Mở Rộng Lịch Sử Bash: 15 Lệnh Cần Thiết Tăng Năng SuấtLịch sử Bash rất mạnh mẽ. Hiểu cách sử dụng hiệu quả các tính năng mở rộng lịch sử bash sẽ làm bạn cực kỳ hiệu quả trên dòng lệnh Linux.

Bài viết này giải thích 15 ví dụ sử dụng các tính năng mở rộng lịch sử bash sau:

  • Event designators (Chỉ định sự kiện) — Tham chiếu đến một lệnh cụ thể trong lịch sử. Bắt đầu bằng !
  • Word designators (Chỉ định từ) — Tham chiếu đến một từ cụ thể của mục lịch sử. Thường kết hợp với event designator. Event designator và word designator tách bằng dấu hai chấm
  • Modifiers (Bộ sửa đổi) — Sửa đổi kết quả thay thế do event hoặc word designators thực hiện

Bài viết này là một phần của series Hướng dẫn Bash đang tiếp diễn.

Như bạn đã biết, để xem tất cả mục lịch sử, dùng lệnh history. Lệnh này hiển thị tất cả lệnh đã thực thi trước đó cùng với số thứ tự trong bảng lịch sử.

$ history 1 tar cvf etc.tar /etc/ 2 cp /etc/passwd /backup 3 ps -ef | grep http 4 service sshd restart 5 /usr/local/apache2/bin/apachectl restart

Event Designators Lịch Sử Bash

1. Thực thi lệnh cụ thể từ lịch sử dùng !n

Nếu bạn đã thực thi lệnh trước đó, thay vì gõ lại, bạn có thể nhanh chóng thực thi bằng số tương ứng của lệnh trong lịch sử.

Ví dụ, để thực thi lệnh #4, làm sau. Điều này sẽ hiển thị lệnh #4 từ lịch sử, và thực thi ngay lập tức.

$ !4 service sshd restart

Để thực thi lệnh được gõ 2 lệnh trước, làm sau.

$ !-2

Để thực thi lệnh trước đó, làm một trong sau:

$ !! $ !-1

Bạn cũng có thể nhấn <Ctrl>-P (nếu ở chế độ emacs mặc định) để lấy lệnh trước.

Nếu bạn bật chế độ chỉnh sửa vi cho dòng lệnh dùng 'set -o vi', dùng <Esc>-k để lấy lệnh trước.

2. Thực thi lệnh với từ khóa dùng !string và !?string

Bạn cũng có thể dùng từ khóa để thực thi lệnh từ lịch sử.

Ví dụ sau sẽ tìm lệnh trước BẮT ĐẦU BẰNG TỪ KHÓA "ps" và thực thi. Trong ví dụ này, nó lấy lệnh trước "ps -ef | grep http" và thực thi.

$ !ps ps -ef | grep http

Ví dụ sau sẽ tìm lệnh trước CHỨA TỪ KHÓA "apache" và thực thi. Trong ví dụ này, nó lấy lệnh trước "/usr/local/apache2/bin/apachectl restart" và thực thi.

$ !?apache /usr/local/apache2/bin/apachectl restart

3. Thay thế chuỗi từ lệnh trước dùng ^str1^str2^

Trong ví dụ sau, trước hết ta chạy ls để kiểm tra file. Sau nhận ra muốn xem nội dung file. Thay vì gõ lại tên file, ta chỉ thay "ls" trong lệnh trước bằng "cat" như sau.

$ ls /etc/cron.daily/logrotate $ ^ls^cat^ cat /etc/cron.daily/logrotate

Lưu ý: Thêm mẹo lịch sử bash, tham khảo 15 Ví Dụ Thành Thạo Lịch Sử Dòng Lệnh Linux. Giải thích cách hiển thị timestamp trong lịch sử, và cách dùng các biến môi trường liên quan lịch sử bao gồm HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL, và HISTIGNORE

Word Designators Lịch Sử Bash

Word designators rất hữu ích khi bạn muốn gõ lệnh mới, nhưng dùng đối số từ lệnh đã thực thi trước. Một số ví dụ dưới.

4. Lấy đối số thứ 1 của lệnh dùng :^

Trong ví dụ sau, "!cp:^" được đưa làm đối số cho lệnh "ls -l". "!cp:^" tìm lệnh trước trong lịch sử bắt đầu bằng "cp" và lấy đối số thứ 1 của lệnh đó.

$ cp /etc/passwd /backup $ ls -l !cp:^ ls -l /etc/passwd

Ví dụ sau lấy đối số thứ 1 từ lệnh trước.

$ ls -l !!:^

5. Lấy đối số cuối cùng của lệnh dùng :$

Trong ví dụ sau, "!cp:$" được đưa làm đối số cho "ls -l". "!cp:$" tìm lệnh trước trong lịch sử bắt đầu bằng "cp" và lấy đối số cuối cùng của lệnh đó.

$ cp /etc/passwd /backup $ ls -l !cp:$ ls -l /backup

Ví dụ sau lấy đối số cuối từ lệnh trước.

$ls -l !!:$

6. Lấy đối số thứ n của lệnh dùng :n

Trong ví dụ sau, "!tar:2" được đưa làm đối số cho "ls -l". "!tar:2" tìm lệnh trước trong lịch sử bắt đầu bằng "tar" và lấy đối số thứ 2 của lệnh đó.

$ tar cvfz /backup/home-dir-backup.tar.gz /home $ ls -l !tar:2 ls -l /backup/home-dir-backup.tar.gz

7. Lấy tất cả đối số từ lệnh dùng :*

Trong ví dụ sau, "!cp:*" được đưa làm đối số cho "ls -l". "!cp:*" tìm lệnh trước trong lịch sử bắt đầu bằng "cp" và lấy tất cả đối số của nó.

$ cp /etc/passwd /backup $ ls -l !cp:* ls -l /etc/passwd /backup

8. Tham chiếu từ vừa tìm kiếm gần đây dùng !%

Như giải thích trên, "!?apache" sẽ tìm lệnh trước trong lịch sử CHỨA TỪ KHÓA "apache" và thực thi.

$ /usr/local/apache2/bin/apachectl restart $ !?apache /usr/local/apache2/bin/apachectl restart

!% sẽ tham chiếu đến toàn bộ từ được khớp bởi tìm kiếm "?" trước.

Ví dụ, nếu bạn đã tìm kiếm trước "?apache", "!%" sẽ khớp toàn bộ từ "/usr/local/apache2/bin/apachectl". Lưu ý "/" được xem là một phần của từ trong ngữ cảnh này.

Vì vậy, trong trường hợp này, bằng cách thực thi sau, bạn có thể dừng apache.

$ !% stop /usr/local/apache2/bin/apachectl stop

9. Lấy phạm vi đối số từ lệnh dùng x-y

Trong ví dụ sau, "!tar:3-5" được đưa làm đối số cho "ls -l". "!tar:3-5" tìm lệnh trước trong lịch sử bắt đầu bằng "tar" và lấy đối số từ 3 đến 5.

$ tar cvf home-dir.tar john jason ramesh rita $ ls -l !tar:3-5 ls -l john jason ramesh

Sau lấy tất cả đối số từ 2.

$ ls -l !tar:2-$

Lưu ý sau:

  • !!:* Lấy tất cả đối số từ lệnh trước
  • !!:2* Lấy tất cả đối số từ đối số thứ 2.
  • !!:2-$ Giống trên. Lấy tất cả đối số từ đối số thứ 2.
  • !!:2- Lấy tất cả đối số từ đối số thứ 2 (trừ đối số cuối).

Modifiers (Bộ Sửa Đổi) Lịch Sử Bash

Modifers đưa ra sau word designators, như giải thích trong ví dụ dưới.

10. Loại bỏ tên đường dẫn cuối từ từ dùng :h

Trong ví dụ sau, "!!:$:h" lấy đối số cuối của lệnh trước, và loại bỏ tên đường dẫn cuối. Trong trường hợp này, nó loại bỏ tên file, chỉ lấy đường dẫn đầy đủ.

$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:h ls -l /very/long/path/name

11. Loại bỏ tất cả tên đường dẫn đầu từ từ dùng :t

Đây là ngược lại ví dụ trước.

Trong ví dụ sau, "!!:$:t" lấy đối số cuối của lệnh trước, và loại bỏ tất cả tên đường dẫn đầu. Trong trường hợp này, nó chỉ lấy tên file.

$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:t ls -l file-name.txt

12. Loại bỏ phần mở rộng tên file từ từ dùng :r

Trong ví dụ sau, "!!:$:r" lấy đối số cuối của lệnh trước, và chỉ loại bỏ ".suffix" (phần mở rộng tên file ở đây). Trong trường hợp này, nó loại bỏ .txt

$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:r ls -l /very/long/path/name/file-name

13. Thay thế kiểu Sed trong lịch sử bash dùng :s/str1/str2/

Thay vì dùng "^original^replacement^" như thảo luận trước, ta cũng có thể dùng thay thế kiểu sed trong lịch sử bash như ví dụ dưới. Có thể dễ nhớ hơn. !! gọi lệnh trước, ":s/original-string/replacement-string/" là cú pháp sed-like để thay thế chuỗi.

$ !!:s/ls -l/cat/

Bạn cũng có thể dùng cờ g (cùng cờ s) để thay thế toàn cục như dưới. Hữu ích khi bạn gõ sai nhiều từ và muốn đổi tất cả cùng lúc và chạy lại lệnh.

Trong ví dụ sau, nhầm lẫn tôi đã đưa "password" hai lần (thay vì passwd).

$ cp /etc/password /backup/password.bak

Để sửa, chỉ làm thay thế toàn cục kiểu sed lịch sử sau.

$ !!:gs/password/passwd/ cp /etc/passwd /backup/passwd.bak

14. Lặp lại thay thế nhanh dùng :&

Nếu bạn đã thực thi thành công một thay thế lịch sử bash như trên, bạn có thể lặp lại cùng thay thế nhanh chóng lại dùng :&.

Tôi lại gõ nhầm "password" thay vì "passwd" trong lệnh khác.

$ tar cvf password.tar /etc/password

Giờ, thay vì gõ lại lệnh, hoặc làm "gs/password/passwd", tôi chỉ dùng ":&", sẽ tái sử dụng thay thế cuối. Dùng ":g&" cho tái sử dụng thay thế cuối toàn cục.

$ !!:g& tar cvf passwd.tar /etc/passwd

15. In lệnh mà không thực thi dùng :p

Rất hữu ích khi bạn làm thay thế lịch sử phức tạp, và muốn xem lệnh cuối cùng trước khi thực thi.

Trong ví dụ sau, "!tar:3-:p", không thực sự thực thi lệnh.

Vì chúng ta cho ":p" ở đây, nó chỉ làm thay thế và hiển thị lệnh mới. Khi đã xác minh mở rộng lịch sử bash, và nghĩ đây là lệnh bạn định chạy, bỏ ":p" và chạy lại.

$ tar cvf home-dir.tar john jason ramesh rita $ tar cvfz new-file.tar !tar:3-:p tar cvfz new-file.tar john jason ramesh