Lịch sử Bash rất mạnh mẽ. Hiểu cách sử dụng hiệu quả các mở rộng lịch sử bash sẽ giúp bạn làm việc 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ử cơ sở sau:
- Bộ chỉ định sự kiện - Đề cập đến một lệnh cụ thể trong lịch sử. Nó bắt đầu bằng a!
- Bộ chỉ định từ - Đề cập đến một từ cụ thể của mục lịch sử. Thông thường, điều này được kết hợp với một người chỉ định chẵn. Ngay cả những người chỉ định và người chỉ định từ cũng được phân tách bằng dấu hai chấm
- Công cụ sửa đổi - Sửa đổi kết quả của sự thay thế được thực hiện bởi những người chỉ định sự kiện hoặc từ
Bài viết này là một phần của Chuỗi Hướng dẫn Bash đang thực hiện của chúng tôi.
Như bạn đã biết, để xem tất cả các mục lịch sử, hãy sử dụng lệnh history. Thao tác này sẽ hiển thị tất cả các lệnh đã được thực hiện trước đó cùng với số của lệnh đó 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
Nhà thiết kế sự kiện lịch sử Bash
1. Thực thi một lệnh cụ thể từ lịch sử bằng cách sử dụng! N
Nếu bạn đã thực hiện một lệnh trước đó, thay vì nhập lại lần nữa, bạn có thể nhanh chóng thực thi lệnh đó bằng cách sử dụng số lượng lệnh tương ứng trong lịch sử.
Ví dụ, để thực hiện lệnh số 4, hãy làm như sau. Thao tác này sẽ hiển thị lệnh số 4 từ lịch sử và thực thi nó ngay lập tức.
$ !4 service sshd restart
Để thực hiện một lệnh đã được nhập lại 2 lệnh, hãy làm như sau.
$ !-2
Để thực hiện lệnh trước, hãy thực hiện bất kỳ thao tác nào sau đây:
$ !! $ !-1
Bạn cũng có thể nhấn
Nếu bạn đã bật chỉnh sửa kiểu vi cho dòng lệnh bằng cách sử dụng ‘set -o vi’, hãy sử dụng
2. Thực thi một lệnh với các từ khóa bằng cách sử dụng! String và!? String
Bạn cũng có thể sử dụng các từ khóa để thực thi một lệnh từ lịch sử.
Ví dụ sau sẽ tìm kiếm lệnh trước đó SAO với từ khóa "Ps" và thực hiện nó. Trong ví dụ này, nó chọn lệnh trước đó “ps -ef | grep http ”và thực thi nó.
$ !ps ps -ef | grep http
Ví dụ sau sẽ tìm kiếm lệnh trước đó CHỨA từ khóa "Apache" và thực thi nó. Trong ví dụ này, nó chọn lệnh trước đó “/ usr / local / apache2 / bin / apachectl restart” và thực thi nó.
$ !?apache /usr/local/apache2/bin/apachectl restart
3. Thay thế một chuỗi từ lệnh trước bằng cách sử dụng ^ str1 ^ str2 ^
Trong ví dụ sau, đầu tiên chúng ta thực hiện lệnh ls để xác minh một tệp. Sau đó, chúng tôi nhận ra rằng chúng tôi muốn xem nội dung của tệp. Thay vì gõ lại toàn bộ tên tệp, chúng ta chỉ có thể thay thế "ls" trong lệnh trước bằng "cat" như hình dưới đây.
$ ls /etc/cron.daily/logrotate $ ^ls^cat^ cat /etc/cron.daily/logrotate
Lưu ý:Để biết thêm các mẹo về lịch sử cơ sở, hãy tham khảo 15 Ví dụ Để Thành thạo Lịch sử Dòng lệnh Linux. Điều này giải thích cách hiển thị dấu thời gian trong lịch sử và cách sử dụng các biến môi trường liên quan đến lịch sử khác nhau bao gồm HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL và HISTIGNORE
Trình thiết kế từ lịch sử Bash
Bộ chỉ định Word rất hữu ích khi bạn muốn nhập một lệnh mới, nhưng hãy sử dụng đối số từ một trong các lệnh đã được thực thi trước đó. Một số ví dụ được hiển thị bên dưới.
4. Nhận đối số đầu tiên của lệnh bằng cách sử dụng:^
Trong ví dụ sau, “! Cp:^” được đưa ra làm đối số cho lệnh “ls -l”. “! Cp:^” định vị lệnh trước đó trong lịch sử bắt đầu bằng “cp” và nhận đối số đầu tiên của lệnh đó.
$ cp /etc/passwd /backup $ ls -l !cp:^ ls -l /etc/passwd
Ví dụ sau lấy đối số thứ nhất từ lệnh trước.
$ ls -l !!:^
5. Nhận đối số cuối cùng của lệnh bằng cách sử dụng:$
Trong ví dụ sau, “! Cp:$” được đưa ra làm đối số cho lệnh “ls -l”. “! Cp:$” định vị lệnh trước đó trong lịch sử bắt đầu bằng “cp” và nhận đố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 cùng từ lệnh trước đó.
$ls -l !!:$
6. Nhận đối số thứ n của lệnh bằng cách sử dụng:n
Trong ví dụ sau, “! Tar:2” được đưa ra làm đối số cho lệnh “ls -l”. “! Tar:2” định vị lệnh trước đó trong lịch sử bắt đầu bằng “tar” và nhận đố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. Nhận tất cả các đối số từ một lệnh bằng cách sử dụng:*
Trong ví dụ sau, “! Cp:*” được đưa ra làm đối số cho lệnh “ls -l”. “! Cp:*” định vị lệnh trước đó trong lịch sử bắt đầu bằng “cp” và nhận tất cả các đối số của lệnh đó.
$ cp /etc/passwd /backup $ ls -l !cp:* ls -l /etc/passwd /backup
8. Tham khảo từ được tìm kiếm gần đây bằng cách sử dụng!%
Như chúng tôi đã giải thích ở trên, “!? Apache” sẽ tìm kiếm lệnh lịch sử trước đó CHỨA từ khóa “apache” và thực thi nó.
$ /usr/local/apache2/bin/apachectl restart $ !?apache /usr/local/apache2/bin/apachectl restart
!% sẽ đề cập đến toàn bộ từ được so khớp với dấu “?” trước đó tìm kiếm.
Ví dụ:Nếu trước đây bạn đã tìm kiếm “? Apache”, thì “!%” Sẽ khớp với toàn bộ từ “/ usr / local / apache2 / bin / apachectl”. Lưu ý rằng “/” được coi là một phần của một từ trong ngữ cảnh này.
Vì vậy, trong trường hợp này, bằng cách thực hiện như sau, bạn có thể dừng apache.
$ !% stop /usr/local/apache2/bin/apachectl stop
9. Nhận phạm vi đối số từ một lệnh bằng cách sử dụng x-y
Trong ví dụ sau, “! Tar:3-5” được đưa ra làm đối số cho lệnh “ls -l”. “! Tar:3-5” định vị lệnh trước đó trong lịch sử bắt đầu bằng “tar” và nhận các đố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
Phần sau nhận tất cả các đối số từ 2.
$ ls -l !tar:2-$
Hãy lưu ý những điều sau:
- !!:* Nhận tất cả các đối số từ lệnh trước
- !!:2 * Nhận tất cả các đối số bắt đầu từ đối số thứ 2.
- !!:2- $ Tương tự như trên. Nhận tất cả các đối số bắt đầu từ đối số thứ 2.
- !!:2- Nhận tất cả các đối số bắt đầu từ đối số thứ 2 (ngoại trừ đối số cuối cùng).
Công cụ sửa đổi lịch sử Bash
Modifers được đặt sau các từ chỉ định, như được giải thích trong các ví dụ bên dưới.
10. Xóa tên đường dẫn cuối khỏi một từ bằng cách sử dụng:h
Trong ví dụ sau, “!!:$:h” lấy đối số cuối cùng của lệnh trước đó và xóa tên đường dẫn theo sau. Trong trường hợp này, nó sẽ xóa tên tệp và chỉ nhận được đường dẫn đầy đủ.
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:h ls -l /very/long/path/name
11. Xóa tất cả tên đường dẫn đầu khỏi một từ bằng cách sử dụng:t
Điều này hoàn toàn ngược lại với ví dụ trước.
Trong ví dụ sau, “!!:$:t” lấy đối số cuối cùng của lệnh trước đó và xóa tất cả các tên đường dẫn đầu. Trong trường hợp này, nó chỉ nhận được tên tệp.
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:t ls -l file-name.txt
12. Xóa phần mở rộng tên tệp khỏi một từ bằng cách sử dụng:r
Trong ví dụ sau, “!!:$:r” lấy đối số cuối cùng của lệnh trước đó và chỉ xóa “.suffix” (ở đây là phần mở rộng tên tệp). Trong trường hợp này, nó đã xóa .txt
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:r ls -l /very/long/path/name/file-name
13. Sed like Thay thế trong lịch sử bash bằng cách sử dụng:s / str1 / str2 /
Thay vì sử dụng “^ ban đầu ^ thay thế ^” như chúng ta đã thảo luận trước đó, chúng ta cũng có thể sử dụng thay thế giống như sed trong lịch sử bash như được hiển thị trong ví dụ bên dưới. Điều này có thể dễ nhớ. !! là gọi lệnh trước đó, “:s / original-string / Replace-string /” là cú pháp giống sed để thay thế một chuỗi.
$ !!:s/ls -l/cat/
Bạn cũng có thể sử dụng cờ g (cùng với cờ s) để thay thế toàn cục như hình dưới đây. Điều này rất hữu ích khi bạn đã nhập sai nhiều từ và muốn thay đổi tất cả chúng lại với nhau và thực hiện lại lệnh.
Trong ví dụ sau, do nhầm lẫn, tôi đã cấp "mật khẩu" hai lần (thay vì mật khẩu).
$ cp /etc/password /backup/password.bak
Để khắc phục điều này, chỉ cần thực hiện thay thế lịch sử toàn cầu sau đây.
$ !!:gs/password/passwd/ cp /etc/passwd /backup/passwd.bak
14. Lặp lại thay thế nhanh chóng bằng cách sử dụng:&
Nếu bạn đã thực hiện thay thế lịch sử bash thành công như được hiển thị ở trên, bạn có thể lặp lại thay thế tương tự một cách nhanh chóng bằng cách sử dụng:&.
Do nhầm lẫn, tôi đã nhập lại "mật khẩu" thay vì "mật khẩu" trong một lệnh khác.
$ tar cvf password.tar /etc/password
Bây giờ, thay vì nhập lại lệnh hoặc thực hiện “gs / password / passwd”, tôi chỉ có thể sử dụng “:&”, sẽ sử dụng lại lần thay thế cuối cùng. Sử dụng “:g &” để sử dụng lại phần phụ cuối cùng trên toàn cầu.
$ !!:g& tar cvf passwd.tar /etc/passwd
15. In lệnh mà không cần thực thi bằng cách sử dụng:p
Điều này rất hữu ích khi bạn đang thực hiện thay thế lịch sử phức tạp và bạn muốn xem lệnh cuối cùng trước khi thực thi nó.
Trong ví dụ sau, “! Tar:3-:p”, không thực sự thực thi lệnh.
Vì chúng tôi đã đưa ra “:p” ở đây, nó chỉ thực hiện thay thế và hiển thị lệnh mới. Khi bạn đã xác minh mở rộng lịch sử bash và nếu bạn cho rằng đây là lệnh bạn định chạy, hãy xóa “:p” và thực thi 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