Hầu hết hướng dẫn phím tắt lịch sử Bash liệt kê hết tất cả các phím tắt có sẵn. Vấn đề là tôi dùng một phím tắt một lần, rồi ngẩn ngơ khi thử mọi khả năng. Sau đó chuyển sang ngày làm việc và hoàn toàn quên chúng, chỉ nhớ thủ thuật !! nổi tiếng tôi học khi mới bắt đầu dùng Bash.
Vì vậy hầu hết không bao giờ được ghi nhớ.
Bài viết này trình bày các phím tắt tôi thực sự dùng hàng ngày. Nó dựa trên một phần nội dung sách của tôi, Learn Bash the hard way; (bạn có thể đọc bản xem trước để tìm hiểu thêm).
Khi mọi người thấy tôi dùng các phím tắt này, họ thường hỏi, "Bạn vừa làm gì vậy!?" Nó đòi hỏi nỗ lực hoặc trí tuệ tối thiểu, nhưng để thực sự học chúng, tôi khuyên dùng một phím tắt mỗi ngày trong một tuần, rồi chuyển sang cái tiếp theo. Việc dành thời gian để thành thạo chúng đáng giá, vì thời gian bạn tiết kiệm sẽ đáng kể trong dài hạn.
1. Phím tắt "đối số cuối cùng": !$
Nếu bạn chỉ lấy một phím tắt từ bài này, hãy lấy cái này. Nó thay thế đối số cuối cùng của lệnh trước vào dòng lệnh hiện tại.
Xem kịch bản này:
$ mv /path/to/wrongfile /some/other/place
mv: cannot stat '/path/to/wrongfile': No such file or directory
À, tôi để nhầm tên file wrongfile trong lệnh. Tôi nên để rightfile.
Bạn có thể quyết định gõ lại lệnh cuối và thay wrongfile bằng rightfile hoàn toàn. Thay vào đó, bạn có thể gõ:
$ mv /path/to/rightfile !$
mv /path/to/rightfile /some/other/place
và lệnh sẽ chạy.
Có cách khác đạt được điều tương tự trong Bash với phím tắt, nhưng thủ thuật tái sử dụng đối số cuối cùng của lệnh trước là thứ tôi dùng nhiều nhất.
2. Phím tắt "đối số thứ n": !:2
Bạn đã bao giờ làm điều như sau?
$ tar -cvf afolder afolder.tar
tar: failed to open
Giống nhiều người khác, tôi nhầm đối số của tar (và ln) nhiều hơn tôi muốn thừa nhận.

Khi bạn nhầm đối số như vậy, bạn có thể chạy:
$ !:0 !:1 !:3 !:2
tar -cvf afolder.tar afolder
và danh tiếng của bạn được cứu vớt.
Các mục của lệnh trước được đánh chỉ mục từ 0 và có thể thay thế bằng số sau !:.
Tất nhiên, bạn cũng có thể dùng điều này để tái sử dụng đối số cụ thể từ lệnh trước thay vì tất cả.
3. Phím tắt "tất cả đối số": !:1-$
Hãy tưởng tượng tôi chạy lệnh như:
$ grep '(ping|pong)' afile
Đối số đúng; tuy nhiên, tôi muốn khớp ping hoặc pong trong file, nhưng dùng grep thay vì egrep.
Tôi bắt đầu gõ egrep, nhưng không muốn gõ lại đối số khác. Vậy tôi dùng phím tắt !:1$ để yêu cầu tất cả đối số của lệnh trước từ cái thứ hai (nhớ chúng đánh chỉ mục từ 0) đến cái cuối (được biểu diễn bằng dấu $).
$ egrep !:1-$
egrep '(ping|pong)' afile
ping
Bạn không cần chọn 1-$; có thể chọn tập con như 1-2 hoặc 3-9 (nếu lệnh trước có nhiều đối số 그만큼).
4. Phím tắt "lệnh trước đó n": !-2:$
Các phím tắt trên tuyệt vời khi tôi biết ngay cách sửa lệnh trước, nhưng thường tôi chạy lệnh sau lệnh gốc, nghĩa là lệnh cuối không còn là lệnh tôi muốn tham chiếu.
Ví dụ, dùng ví dụ mv trước, nếu tôi theo dõi lỗi bằng ls kiểm tra nội dung thư mục:
$ mv /path/to/wrongfile /some/other/place
mv: cannot stat '/path/to/wrongfile': No such file or directory
$ ls /path/to/
rightfile
Tôi không còn dùng được phím tắt !$.
Trong trường hợp này, tôi có thể chèn -n: (nơi n là số lệnh lùi lại trong lịch sử) sau ! để lấy đối số cuối từ lệnh cũ hơn:
$ mv /path/to/rightfile !-2:$
mv /path/to/rightfile /some/other/place
Lại một lần, khi đã học, bạn có thể ngạc nhiên tại sao bạn cần nó thường xuyên như vậy.
5. Phím tắt "cho tôi thư mục": !$:h
Cái này trông không hứa hẹn gì, nhưng tôi dùng nó chục lần mỗi ngày.
Hãy tưởng tượng tôi chạy lệnh như:
$ tar -cvf system.tar /etc/system
tar: /etc/system: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
Điều đầu tiên tôi muốn làm là vào thư mục /etc xem có gì và tìm ra sai ở đâu.
Tôi có thể làm một cú nhích:
$ cd !$:h
cd /etc
Cái này nói: "Lấy đối số cuối cùng của lệnh trước (/etc/system) và bỏ thành phần tên file cuối, chỉ còn /etc."
6. Phím tắt "dòng hiện tại": !#:1
Nhiều năm, tôi thỉnh thoảng tự hỏi có thể tham chiếu đối số trên dòng hiện tại không trước khi cuối cùng tra cứu và học nó. Tôi ước gì làm sớm hơn. Tôi thường dùng nó để tạo file backup:
$ cp /path/to/some/file !#:1.bak
cp /path/to/some/file /path/to/some/file.bak
nhưng một khi thành thạo, nó có thể là lựa chọn nhanh thay cho …
7. Phím tắt "tìm và thay thế": !!:gs
Cái này tìm kiếm qua lệnh được tham chiếu và thay thế nội dung trong hai ký tự / đầu bằng nội dung trong hai ký tự / sau.
Giả sử tôi muốn nói cho thế giới phím s không hoạt động và ra f thay vào đó:
$ echo my f key doef not work
my f key doef not work
Sau đó tôi nhận ra tôi chỉ vô tình bấm phím f. Để thay tất cả f thành s, tôi gõ:
$ !!:gs/f /s /
echo my s key does not work
my s key does not work
Nó không chỉ hoạt động trên ký tự đơn; tôi có thể thay từ hoặc câu:
$ !!:gs/does/did/
echo my s key did not work
my s key did not work
Thử chúng
Chỉ để chỉ cách các phím tắt này có thể kết hợp, bạn có thể tính ra những "móng tay" này sẽ ra gì?
$ ping !#:0:gs/i/o
$ vi /tmp/!:0.txt
$ ls !$:h
$ cd !-2:h
$ touch !$!-3:$ !! !$.txt
$ cat !:1-$
Kết luận
Bash có thể là nguồn phím tắt thanh lịch cho người dùng dòng lệnh hàng ngày. Dù có hàng ngàn mẹo và thủ thuật để học, đây là những cái yêu thích tôi thường dùng.
Nếu bạn muốn đi sâu hơn vào tất cả Bash có thể dạy, hãy mua sách của tôi, Learn Bash the hard way hoặc xem khóa học trực tuyến, Master the Bash shell.
Bài viết này đăng tải ban đầu trên blog của Ian, Zwischenzugs.com, và được tái sử dụng với sự cho phép.