12/08/2018, 17:11

Command Line History

Khi các bạn sử dụng Linex command line thường xuyên, việc sử dụng history về các câu lệnh mình đã dùng sẽ giúp tăng hiệu suất công việc. Ví dụ: mấy hôm trước mình có cài 1 đống package hoặc phần mềm gì đó, mà hôm nay không hiểu máy có vấn đề gì mà phải cài lại. Ta có thể xem lại history để coi ...

Khi các bạn sử dụng Linex command line thường xuyên, việc sử dụng history về các câu lệnh mình đã dùng sẽ giúp tăng hiệu suất công việc.

Ví dụ: mấy hôm trước mình có cài 1 đống package hoặc phần mềm gì đó, mà hôm nay không hiểu máy có vấn đề gì mà phải cài lại. Ta có thể xem lại history để coi lại nhưng gì cài đặt lúc trước, thay vì đi tìm tất cả các package trên mạng, rất mất thời gian. Một ví dụ khác: trong khi chúng ta đang thao tác rất mạnh tay, nhưng có một phút không tập trung nào đó. Không nhớ là đã làm cái gì mà tự nhiên chương trình nó bị lỗi, ta cũng có thể xem lại history để xem chúng ta vừa làm cái gì mà chương trình nó lăn ra chết.

Tìm kiếm sử dụng Control+R

Sử dụng Control+R và gõ vào từ khóa muốn search thì sẽ tìm kiếm tới câu lệnh dùng gần nhất với từ khóa mình nhập vào.

dưới đây là kết quả khi mình search với từ khóa "mongodb"

Lặp lại câu lệnh vừa thực hiện với 4 cách khác nhau

  1. sử dụng mũi tên ↑
  2. Gõ !!
  3. !-1
  4. Sử dụng tổ hợp phím Ctrl+p

Thực thi chính xác câu lệnh đã dùng từ lịch sử

Trong ví dụ dưới đây nếu muốn thực thi chính xác câu lệnh: Gõ lệnh:

$ history | more

màn hình xuất hiện những câu lệnh đã thực hiện, giờ muốn thực thi lại chính xác câu lệnh số 2001:

$ !2001

nhấn enter và kết quả như sau:

Thực thi câu lệnh trước đó, cái mà bắt đầu với chính xác một từ

lấy ví dụ trên, giờ thực hiện câu lệnh sau:

$ !curl

kết quả cũng tương tự.

Xóa lịch sử

$ history -c

Thay thế từ từ lịch sử câu lệnh

Khi sử dụng tìm kiếm thông qua lịch sử câu lênh, chúng ta có thể muốn thực thi một câu lệnh khác nhưng với cùng parameter từ một câu lệnh cũ. Trong ví dụ dưới đây, !!:$$sẽ lấy argument từ câu lệnh trước đó:

$ ls anaconda-ks.cfg
anaconda-ks.cfg
$ vi !!:$
vi anaconda-ks.cfg

Một ví dụ khác:

$ cp anaconda-ks.cfg anaconda-ks.cfg.bak
anaconda-ks.cfg
$ vi !^
vi anaconda-ks.cfg

Ví dụ trên thì !^ sẽ lấy argument đầu tiên từ câu lệnh trước đó để làm argument cho câu lệnh hiện tại.

Thay thế một argument cụ thể cho một câu lệnh cụ thể

ví dụ dưới đây, !cp:2 sẽ tìm một câu lệnh bắt đầu bằng cp và lấy đối số thứ 2 cho nó.

$ cp ~/longname.txt /really/a/very/long/path/long-
filename.txt
$ ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt

hoặc

$ ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt

!cp:$$sẽ tìm một câu lệnh trước đó bắt đầu bằng cp và lấy đối số cuối cùng của nó.

Sử dụng History Expansion có thể giúp bạn chọn đúng 1 command cụ thể đã thực hiện, dựa vào đó có thể thực hiện lại hoặc chỉnh sửa nó theo ý muốn. Kí tự ! bắt đầu cho History Expansion.

  • !! lặp lai câu lệnh ngay trước đó.
  • !10 lặp lại câu lệnh thứ 10 từ lịch sử command.
  • !-2 lặp lại câu lênh thứ 2 từ command gần nhất.
  • !string lặp lại câu lệnh với một từ khóa cụ thể.
  • !?string lặp lại câu lệnh có chứ từ khóa cụ thể.
  • ^str1^str2^ tháy thế str1 của command thứ nhất với str2 và thực thi nó.
  • *!!:$$ lấy đối số cuối cu từ câu lệnh trước đó.
  • !string:n lấy đối số thứ n từ câu lệnh trước đó với "string" là bắt đầu của câu lệnh.

Ví dụ: !?string

Thực thi câu lệnh:

$ /usr/local/apache2/bin/apachectl restart

Sau đó t muốn thực thi lại câu lệnh trên:

$ !apache
-bash: !apache: event not found

ở đây sẽ gặp lỗi bởi vì không có lệnh nào bắt đầu bằng "apache", nhưng câu lệnh duới đây thì thực hiện được vì nó là một câu lệnh có chứa từ "apache"

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

Ví dụ: ^str1^str2^

Thực hiện lệnh:

$ ls /etc/sysconfig/network

ta muốn thay ls bằng vi:

$ ^ls^vi
vi /etc/sysconfig/network

*Ví dụ: !!:$$

$ cp /etc/passwd /home/ramesh/passwd.bak

Lênh trên là lệnh copy vào thư mục có đường dẫn: /home/ramesh/passwd.bak giờ ta muốn mở file trên:

$ vi !!:$
vi /home/ramesh/passwd.bak
//or
$ vi !:$
vi /home/ramesh/passwd.bak

Ví dụ: !string:n

$ tar cvfz ~/sysconfig.tar.gz /etc/sysconfig/*

Giờ muốn ls tập tin mới tạo ra ta làm như sau:

$ ls -l !tar:2
ls -l ~/sysconfig.tar

Trên đây là một số ví dụ cơ bản về command line history. Hi vọng sẽ giúp ích cho các bạn được phần nào. Cảm ơn vì đã đọc bài của mình.

Nguồn: tham khảo.

0