- Tổng hợp các cách tận dụng phím tắt bàn phím và tổ hợp lệnh khác nhau để tăng tốc độ và hiệu quả làm việc trong môi trường shell
- Có thể chỉnh sửa dòng lệnh bằng các phím tắt cơ bản như CTRL + W, U, K, Y, di chuyển con trỏ với CTRL + A/E, ALT + B/F, và khôi phục terminal bằng reset
- Trong Bash và Zsh, có thể dùng CTRL + R để tìm kiếm lịch sử lệnh, tái sử dụng lệnh trước đó bằng !!·!$·ESC+., và tự động hóa tác vụ lặp lại với Brace Expansion và Globstar
- Các tính năng nâng cao như Process Substitution, tee, bg/disown giúp kiểm soát tiến trình và quản lý log hiệu quả hơn
- Nếu dùng shell một cách thành thạo như một hộp dụng cụ, bạn có thể nâng cao năng suất và sự tập trung; điều quan trọng là hình thành thói quen từng phím tắt một
Các phím tắt và tính năng cơ bản hoạt động trong gần như mọi shell
-
Tổ hợp CTRL + W, U, K, Ylà các phím tắt chỉnh sửa dòng lệnh giúp xóa hoặc khôi phục nhanh từ hay phần đầu/cuối dòng dựa trên vị trí con trỏ
CTRL + W xóa từ phía trước con trỏ
CTRL + U cắt từ vị trí con trỏ đến đầu dòng, có thể dán lại bằng CTRL + Y
CTRL + K cắt từ vị trí con trỏ đến cuối dòng
- CTRL + A / E di chuyển đến đầu và cuối dòng, ALT + B / F di chuyển lùi/tiến theo từng từ
- Được bật mặc định trong phần lớn terminal; trên Mac cần đặt phím Option thành Meta thì mới hoạt động
- Lệnh reset hoặc stty sane có thể khôi phục terminal khi màn hình bị hỏng do lỡ in ra tệp nhị phân
- Dù màn hình bị lỗi vẫn có thể nhập, chỉ cần gõ
reset rồi nhấn Enter để khôi phục
- CTRL + C / D lần lượt dùng để ngắt lệnh và gửi tín hiệu EOF (kết thúc tệp)
- Nhấn
CTRL + D ở prompt trống sẽ thoát shell
- CTRL + L tương đương lệnh
clear, giúp dọn màn hình ngay lập tức
- Đồng thời giữ nguyên lệnh đang nhập và đưa prompt lên đầu màn hình
- cd - chuyển ngay về thư mục trước đó, còn pushd / popd cho phép qua lại nhiều vị trí bằng ngăn xếp thư mục
- > file.txt làm trống tệp mà không xóa nó, nên giữ nguyên quyền hạn và chủ sở hữu
- Biến $_ dùng lại đối số cuối cùng của lệnh trước
- Ví dụ:
mkdir -p /path/newdir && cd "$_"
- set -e, set -u là các tùy chọn giúp tăng độ an toàn cho script
set -e sẽ thoát ngay khi xảy ra lỗi
set -u sẽ báo lỗi khi tham chiếu tới biến chưa được định nghĩa
- Tổ hợp
set -euo pipefail cung cấp lớp bảo vệ mạnh hơn
Các phím tắt và tính năng nâng cao trong Bash và Zsh
- CTRL + R thực hiện tìm kiếm tăng dần ngược trong lịch sử lệnh
- Khi nhập từ khóa, có thể tìm và tái sử dụng ngay các lệnh đã chạy trước đó
- !! chạy lại toàn bộ lệnh trước
- Có thể dùng
sudo !! để chạy lại lệnh vừa rồi với quyền quản trị
- CTRL + X, CTRL + E mở lệnh đang nhập trong trình soạn thảo mặc định (Vim, Nano, v.v.) để chỉnh sửa rồi thực thi
- Trong Zsh cần cấu hình riêng
- Lệnh fc là cách truyền thống để mở lệnh trước đó bằng
$EDITOR và chỉnh sửa
- ESC + . hoặc ALT + . chèn đối số cuối cùng của lệnh ngay trước đó vào vị trí con trỏ
- Khi nhấn lặp lại, có thể lần lượt duyệt qua đối số của các lệnh cũ hơn
- !$ thực hiện cùng chức năng đó theo cách không tương tác
-
Brace Expansionlà tính năng mở rộng dấu ngoặc nhọn giúp giảm nhập lặp
cp pf.conf{,.bak} → cp pf.conf pf.conf.bak
mv filename.{txt,md} → mv filename.txt filename.md
mkdir -p project/{src,tests,docs} để tạo nhiều thư mục cùng lúc
- Process Substitution
<(command) xử lý đầu ra của lệnh như một tệp
- Ví dụ:
diff <(sort file1.txt) <(sort file2.txt) để so sánh mà không cần tệp tạm
- Globstar(
**) tìm tệp đệ quy xuống cả các thư mục con
- Trong Bash, bật bằng
shopt -s globstar; trong Zsh, tính năng này được bật sẵn
- Ví dụ:
ls **/*.js để tìm các tệp JS trong mọi thư mục con
-
Tổ hợp CTRL + Z**,** bg**,** disowngiúpchạy nền tiến trình và tách khỏi shell
CTRL + Z để tạm dừng → bg để chạy nền → disown để tách khỏi shell
- Nhờ đó tiến trình vẫn tiếp tục chạy ngay cả sau khi đóng SSH
- command |& tee file.log sẽ chuyển đồng thời đầu ra chuẩn (stdout) và lỗi chuẩn (stderr) qua pipe
|& là dạng rút gọn của 2>&1 |
- Dùng
tee để vừa in ra màn hình vừa lưu log
Lời khuyên cốt lõi khi sử dụng shell
- Shell là một hộp dụng cụ, và nếu dùng thành thạo có thể tăng năng suất rất nhiều
- Thay vì cố học tất cả phím tắt cùng lúc, cách hiệu quả hơn là biến chúng thành thói quen từng cái một
- Có thể đơn giản hóa luồng làm việc bằng cách giảm nhập lặp và thao tác gõ không cần thiết
- Khi đã quen, terminal sẽ không còn là vật cản mà trở thành không gian làm việc của riêng bạn
3 bình luận
Hầu hết đều là key binding của emacs, nhưng gần như chẳng nhắc gì đến Emacs; nhìn chúng được chia sẻ nhiều như mấy mẹo vặt dạo này lại thấy có cảm giác đổi thay của thời thế. Thư viện
readlinethực ra là nơi triển khai toàn bộ key binding kiểu Emacs. Có cảm giác đã gần 20 năm kể từ khi mọi thứ hầu như chuyển hết sang IDE, nhưng từ góc nhìn của một hóa thạch vẫn còn dùng thứ nhưgdbtui, tôi lại nghĩ rằng cái gì tốt thì quả nhiên không chết.Ý kiến trên Hacker News
Khoảnh khắc mình cảm thấy cuộc đời thay đổi là khi remap phím mũi tên lên
Giờ mình không phải duyệt qua mọi lệnh nữa, mà chỉ tìm các lệnh bắt đầu bằng phần đã gõ sẵn
Ví dụ, gõ
tar -rồi nhấn mũi tên lên thì các tùy chọn tar đã dùng trước đó hiện ra ngayTrong zsh có thể cấu hình như sau
.inputrcnhư sau.inputrcBật vim-mode trong terminal khiến mọi thứ thoải mái hơn hẳn
Lỡ sai ở chỗ cách ba từ?
3bcwlà xongXóa cả dòng thì
cc, chỉnh sửa phức tạp thì bấmvđể mở thẳng trong (neo)vimNếu bạn đã dùng (neo)vim rồi thì quá tuyệt vì không cần học thêm phím tắt mới
ctrl-x+eđể mở bằng neovim là một thỏa hiệp hợp lýset -o viMình thấy ấn tượng với chuyện có người đặt một script tên
\#vào PATH để có thể comment out một phần của pipeline~/bin/nogloblàm như vậy để tránh xung đột noglob khi gọi script zsh từ bashmycmd1 #| mycmd2$PATHcủa mìnhCTRL+W thường xóa đến khoảng trắng trước đó, nên nó sẽ xóa cả
/var/log/nginx/Alt+Backspace thì xóa đến trước ký tự không phải chữ cái
Chỉ cần lưu ý là nó có thể trùng với phím tắt đóng tab trình duyệt
/khỏi cấu hình$WORDCHARSthì sẽ có được hành vi mong muốn (liên kết tham khảo)Mình khuyên nên nâng cấp tìm kiếm lịch sử bằng fzf shell integration
Video demo / Tài liệu chính thức
Mình có một mẹo hay dùng
Khi đang gõ một lệnh dài mà cần làm việc khác trước, mình không
Ctrl-Cđể hủy mà sẽ comment nó lại rồi chạy để nó vẫn nằm trong history"push-line-or-edit", còn trong bash thì có thể mô phỏng gần giống bằngC-urồiC-yctrl-uđể lưu và xóa dòng hiện tại, rồictrl-yđể dán lại sau. Trong zsh có thể tự động hóa quy trình này bằngalt-qalt-shift-3có thể thêm#vào đầu lệnh hiện tại rồi chuyển sang dòng mớiMình không thích kiểu tiêu đề mang hơi hướng LLM, nhưng vài mẹo trong đó khá hữu ích nên mình sẽ thử
Khá tiếc là brace expansion không phối hợp tốt với tab completion. Sẽ hay hơn nếu có thêm tính năng như nhân bản token cuối hoặc xóa phần mở rộng file
Mình dùng một hàm trong cấu hình zsh để loại một số lệnh khỏi history
Ví dụ để những lệnh nguy hiểm như
--forcekhông bị lưu vào historyMình dùng một snippet trong zsh để tự động mở rộng global alias
Ví dụ đặt
alias -G G='rg -s'thì khi gõcommand | G, nó sẽ tự động mở rộng thànhcommand | rg -sNó tự mở rộng khi nhấn space, còn nếu gõ
\aliasthì sẽ bỏ qua việc mở rộngMình có một hàm “deep cd” tự viết trong
.bashrcNó tự chuyển vào thư mục đầu tiên có đường dẫn chứa chuỗi được truyền làm đối số
Ban đầu mình nghĩ nó sẽ chậm, nhưng hóa ra dùng thường xuyên hơn mình tưởng
jccủa autojump, z, hoặc fzfPhía trên, vụ remap phím mũi tên lên thì người dùng Emacs cứ dùng
c-rlà xong. Đỉnh cao của tinh chỉnh là để nguyên bản.