
Thủ thuật Shell giúp cuộc sống dễ dàng hơn (và giúp bạn tỉnh táo hơn)
Shell Tricks That Make Life Easier (and Save Your Sanity)
Bài viết này điểm qua những phím tắt chỉnh sửa dòng lệnh (shell) cực kỳ hữu ích, giúp developer chúng ta làm việc hiệu quả hơn và bớt "khó chịu". Nắm vững vài "chiêu" như `Ctrl+W` để xóa từng từ, `Ctrl+U`/`Ctrl+K` để cắt/dán cả dòng, hay `Ctrl+A`/`Ctrl+E` để nhảy đến đầu/cuối dòng sẽ giúp giảm đáng kể số lần gõ phím. Anh em dev nên tích hợp những "mẹo" POSIX-compliant này vào quy trình làm việc hàng ngày để tránh việc chỉnh sửa thủ công tốn thời gian. Thậm chí, khi lỡ tay in ra output toàn ký tự nhị phân "hại mắt", lệnh `reset` cũng sẽ cứu nguy. Hiểu và dùng thành thạo những shortcut này là chìa khóa để tương tác với terminal một cách mượt mà, kể cả trên những hệ thống tối giản nhất.
Có một cảm giác đau đớn rõ rệt khi chứng kiến một kỹ sư xuất sắc nhấn giữ phím Backspace trong sáu giây liên tục để sửa lỗi đánh máy ở đầu một dòng. Tất cả chúng ta đều đã ở đó....
Có một cảm giác đau đớn rõ rệt khi chứng kiến một kỹ sư xuất sắc nhấn giữ phím Backspace trong sáu giây liên tục để sửa lỗi đánh máy ở đầu một dòng.
Tất cả chúng ta đều đã ở đó. Chúng tôi học ls, cd, và grep, sau đó chúng tôi gần như… dừng lại. Nhà ga trở thành nơi chúng ta ở nhưng chúng ta hiếm khi bận tâm đến việc sắp xếp đồ đạc. Chúng tôi chấp nhận rằng một số tác vụ nhất định cần tới 40 lần nhấn phím mà hoàn toàn không biết rằng các tác giả shell đã giải quyết chính xác sự thất vọng của chúng tôi vào năm 1989.
Dưới đây là một số thủ thuật không hẳn là bí mật nhưng cũng không phải lúc nào cũng được dạy. Để duy trì hòa bình trong dòng Unix mở rộng của chúng tôi, tôi đã chia chúng thành hai phe: các thủ thuật phổ quát hoạt động trên hầu hết mọi hệ vỏ POSIX-ish (như sh trên FreeBSD hoặc ksh trên OpenBSD) và các bổ sung nâng cao chất lượng cuộc sống dành riêng cho các hệ vỏ tương tác như Bash hoặc Zsh.
Câu lạc bộ “Hoạt động (gần như) ở mọi nơi”
Những thủ thuật này dựa trên các nguyên tắc dòng thiết bị đầu cuối tiêu chuẩn, hành vi chung của shell Bourne hoặc các tính năng POSIX. Nếu bạn SSH vào bộ định tuyến nhúng từ năm 2009, hộp OpenBSD mới hoặc vùng chứa Alpine tối thiểu, thì những thứ này sẽ vẫn hỗ trợ bạn.
Thay thế Backspace
Tại sao phải xáo trộn từng ký tự khi bạn có thể dịch chuyển tức thời? Đây là các liên kết chỉnh sửa dòng theo kiểu Emacs tiêu chuẩn (thông qua Readline hoặc tương tự), được bật theo mặc định trong hầu hết các shell hiện đại.
CTRL + W: Bạn đang nhập /var/log/nginx/ nhưng thực ra ý bạn là /var/log/apache2/. Bạn có hai lựa chọn: giữ phím Backspace cho đến khi linh hồn rời khỏi cơ thể hoặc nhấn CTRL + W để xóa ngay từ trước con trỏ. Khi bạn đã quen với điều này, việc giữ Backspace có cảm giác như đang đào một cái hố bằng thìa.
CTRL + U và CTRL + K: Bạn đã nhập lệnh rsync 80 ký tự được thiết kế đẹp mắt nhưng đột nhiên nhận ra rằng trước tiên bạn cần kiểm tra xem thư mục đích có thực sự tồn tại hay không. Bạn không muốn xóa nó, nhưng bạn không muốn chạy nó. Nhấn CTRL + U để cắt mọi thứ từ con trỏ đến đầu dòng. Kiểm tra thư mục của bạn rồi nhấn CTRL + Y để dán (“yank”) kiệt tác của bạn ngay vào dấu nhắc. (CTRL + K thực hiện tương tự nhưng cắt từ con trỏ đến cuối của dòng.)
CTRL + A và CTRL + E: Chuyển ngay về đầu (A) hoặc cuối (E) của dòng. Ngừng chạm vào phím Home và End; dù sao thì họ cũng cách xa hàng nhà hàng dặm.
ALT + B và ALT + F: Di chuyển lùi lại (B) hoặc tiến lên (F) toàn bộ một từ mỗi lần. Đó là phím mũi tên nhanh hơn nhiều, thú vị hơn nhiều. (Người dùng Mac: bạn thường phải điều chỉnh cài đặt thiết bị đầu cuối của mình để sử dụng Tùy chọn làm Meta để tính năng này hoạt động).
Cách khắc phục “Ồ không, đầu ra nhị phân”
reset (hoặc stty sane): Mặc dù nó giống một mẹo khôi phục thiết bị đầu cuối hơn là một thủ thuật shell tương tác, nhưng nó thuộc về nơi này. Tất cả chúng ta đều đã làm được điều đó: ý bạn là cat một tệp văn bản, nhưng bạn vô tình cat một tệp nhị phân được biên dịch hoặc một tarball nén. Đột nhiên, thiết bị đầu cuối của bạn xuất hiện các rune và Wingdings cổ xưa, và lời nhắc của bạn hoàn toàn không đọc được. Thay vì xấu hổ đóng cửa sổ terminal, hãy nhập reset (ngay cả khi bạn không thể nhìn thấy các chữ cái mình đang nhập) và nhấn enter. Thiết bị đầu cuối của bạn sẽ tự phục hồi.
Lối thoát khẩn cấp
CTRL + C: Hủy lệnh hiện tại ngay lập tức. Lối thoát khẩn cấp của bạn khi lệnh bị treo hoặc bạn nhận ra mình đang điều chỉnh sai tệp nhật ký.
CTRL + D: Gửi tín hiệu EOF (Kết thúc tệp). Nếu bạn đang nhập dữ liệu vào một lệnh mong đợi, thao tác này sẽ đóng luồng. Nhưng nếu dòng lệnh trống, nó sẽ đăng xuất bạn hoàn toàn khỏi shell-hãy cẩn thận khi bạn nhấn nó.
Trình dọn dẹp màn hình
CTRL + L: Thiết bị đầu cuối của bạn chứa đầy dấu vết ngăn xếp, spaghetti của trình biên dịch và tiếng ồn kỹ thuật số thuần túy. Việc chạy lệnh clear có tác dụng, nhưng nếu bạn mới nhập được nửa chừng một lệnh mới thì sao? CTRL + L xóa sạch bảng, đưa lời nhắc hiện tại của bạn lên trên cùng mà không làm gián đoạn quá trình suy nghĩ của bạn.
Thư mục trước đó Bóng bàn
cd -: Công cụ chuyển kênh cổ điển. Bạn đang tìm hiểu sâu về /usr/local/etc/postfix và bạn cần kiểm tra nội dung nào đó trong /var/log. Bạn nhập cd /var/log, xem nhật ký và bây giờ bạn muốn quay lại. Thay vì nhập lại đường dẫn dài đó, hãy nhập cd -. Nó chuyển bạn đến thư mục trước đó của bạn. Chạy lại và bạn sẽ quay lại nhật ký. Hoàn hảo để chuyển đổi qua lại.
pushd và popd: Nếu cd - là một nút chuyển đổi, pushd là một ngăn xếp. Cần sắp xếp nhiều thư mục? pushd /etc thay đổi thành /etc nhưng lưu thư mục trước đó của bạn vào một ngăn xếp ẩn. Khi bạn hoàn tất, nhập popd để bật nó ra khỏi ngăn xếp và quay lại chính xác nơi bạn đã dừng lại.
Cắt ngắn tức thì
> file.txt: Thao tác này sẽ làm trống hoàn toàn một tệp mà không xóa và tạo lại nó. Tại sao điều này lại quan trọng? Nó bảo vệ quyền, quyền sở hữu tệp và không làm gián đoạn các quá trình đã mở tệp. Nó sạch hơn nhiều so với echo "" > file.txt (thực sự để lại ký tự dòng mới) hoặc rm file && touch file.
Biến “Đối số cuối cùng”
$_: Trong hầu hết các shell, $_ mở rộng đến đối số cuối cùng của lệnh trước đó-đặc biệt hữu ích về mặt tương tác hoặc trong các tập lệnh đơn giản khi bạn cần thao tác trên cùng một đường dẫn dài hai lần:
mkdir -p /some/ridiculously/long/path/newdir && cd "$_"
Không còn phải nhập lại đường dẫn hoặc khai báo các biến tạm thời để vào thư mục bạn đã tạo cách đây một giây.
Trình tiết kiệm tập lệnh
Nếu bạn đang viết các tập lệnh shell, hãy đặt chúng lên trên cùng ngay sau shebang của bạn. Nó sẽ giúp bạn tránh khỏi việc triển khai sự hỗn loạn vào sản xuất.
set -e: Thoát do lỗi. Rất hữu ích, nhưng lại nổi tiếng là kỳ lạ với các trường hợp đặc biệt (đặc biệt là bên trong các điều kiện như câu lệnhif, vòng lặpwhilevà quy trình). Đừng dựa vào nó một cách mù quáng vì nó có thể tạo ra sự tự tin sai lầm. (Mẹo chuyên nghiệp: hãy cân nhắcset -euo pipefailđể có mạng lưới an toàn mạnh mẽ hơn nhưng trước tiên hãy tìm hiểu những lưu ý của nó.)set -u: Coi việc tham chiếu một biến chưa được đặt là một lỗi. Điều này bảo vệ bạn khỏi những thảm họa thảm khốc nhưrm -rf /usr/local/${MY_TYPO_VAR}/*vô tình mở rộng thànhrm -rf /usr/local/*.
Khu vực thoải mái Bash & Zsh Comfort
Nếu bạn đang sử dụng hộp Linux hoặc sử dụng trình bao tương tác hiện đại thì đây là những công cụ tạo nên CLI cảm thấy không giống một chiếc xe đạp rỉ sét mà giống một thứ gì đó thực sự phản hồi khi bạn lái.
Thợ săn lịch sử
CTRL + R: Tìm kiếm gia tăng đảo ngược. Dừng nhấn mũi tên lên bốn mươi lần để tìm một lệnh awk mà bạn đã sử dụng vào thứ Ba tuần trước. Nhấn CTRL + R, bắt đầu nhập từ khóa từ lệnh và nó sẽ kéo từ khóa đó ra khỏi lịch sử của bạn một cách kỳ diệu. Nhấn lại CTRL + R để quay ngược qua các kết quả phù hợp.
Hành động di chuyển “Rất tiếc, Sudo”
: Điều này mở rộng ra toàn bộ lệnh trước đó của bạn.
Trường hợp sử dụng nổi tiếng nhất của nó là hành vi xấu hổ “Quyền bị từ chối”. Bạn tự tin gõ systemctl restart nginx, nhấn enter và hệ thống sẽ cười nhạo vì bạn thiếu đặc quyền. Thay vì nhập lại, hãy chạy:
sudo !!
Đó là cách bạn nói với vỏ, “Hãy làm những gì tôi nói, nhưng lần này với thẩm quyền.”
Escape Editor tối thượng
CTRL + X, rồi CTRL + E: Bạn bắt đầu nhập một dòng ngắn gọn. Sau đó, bạn thêm một đường ống. Sau đó là một câu lệnh awk. Chẳng bao lâu nữa, bạn sẽ phải chỉnh sửa một con quái vật bốn dòng bên trong lời nhắc và việc điều hướng sẽ trở nên khó khăn. Nhấn CTRL + X theo sau là CTRL + E (trong Bash; trong Zsh, thao tác này cần định cấu hình). Thao tác này sẽ đưa lệnh hiện tại của bạn vào trình soạn thảo văn bản mặc định (như Vim hoặc Nano). Bạn có thể chỉnh sửa nó với tất cả sức mạnh của một trình chỉnh sửa thích hợp, lưu và thoát. Sau đó, shell sẽ thực thi lệnh ngay lập tức.
fc: Phiên bản truyền thống, có tính di động cao của CTRL+X CTRL+E. Chạy fc sẽ mở lệnh trước đó trong $EDITOR của bạn. Nó hoạt động trên hầu hết các shell và là một viên ngọc ẩn tuyệt vời để sửa các lệnh phức tạp, nhiều dòng bị lỗi.
Đối số cuối cùng (Phiên bản tương tác)
ESC + . (hoặc ALT + .): Chèn đối số cuối cùng của lệnh trước đó ngay tại con trỏ của bạn. Nhấn nút này nhiều lần để quay lại lịch sử của bạn, thả tên tệp hoặc tham số chính xác mà bạn cần vào ngay lệnh hiện tại của mình.
!$: Anh em không tương tác của ESC + .. Không giống như ESC + . (chèn văn bản trực tiếp vào con trỏ để bạn xem lại hoặc chỉnh sửa), !$ mở rộng một cách mù quáng vào đúng thời điểm bạn nhấn enter. (Mẹo chuyên nghiệp: Đối với tập lệnh hoặc sh tiêu chuẩn, hãy sử dụng biến $_ được đề cập trước đó thay thế!)
Thủ thuật đổi tên & Mở rộng cú đúp
Mở rộng dấu ngoặc đơn thuần túy là một phép thuật giúp tránh việc gõ lặp đi lặp lại, đặc biệt là khi thực hiện sao lưu hoặc đổi tên nhanh chóng.
Mở rộng dự phòng : Cần chỉnh sửa tệp cấu hình quan trọng và muốn tạo bản sao lưu nhanh trước tiên?
cp pf.conf{,.bak
Shell mở rộng phần này một cách liền mạch thành cp pf.conf pf.conf.bak.
Thủ thuật đổi tên:
mv tên tệp.{txt,md
Điều này mở rộng thành mv filename.txt filename.md. Nhanh chóng, thanh lịch và khiến bạn trông giống như một phù thủy.
Cần nhiều thư mục? mkdir -p project/{src,tests,docs tạo cả ba cùng một lúc.
Thay thế quy trình
<(command): Xử lý đầu ra của lệnh như thể nó là một tệp. Giả sử bạn muốn phân biệt các phiên bản được sắp xếp của hai tệp. Theo truyền thống, bạn sẽ sắp xếp chúng thành các tệp tạm thời, phân biệt chúng và dọn dẹp. Quá trình thay thế bỏ qua người trung gian:
diff <(sort file1.txt) <(sort file2.txt)
Quả cầu tối thượng
** (Globstar): find is a great command, but sometimes it feels like overkill. Nếu bạn chạy shopt -s globstar trong Bash (tính năng này được bật theo mặc định trong Zsh), ** sẽ khớp các tệp theo cách đệ quy trong tất cả các thư mục con. Bạn cần tìm tất cả các tệp JavaScript trong thư mục hiện tại của mình và mọi thứ bên dưới thư mục đó?
ls **/*.js
Không cần lệnh tìm.
Tạo nền và Từ chối
CTRL + Z, rồi bg, rồi từ chối :
Bạn đã bắt đầu một tác vụ nhập cơ sở dữ liệu khổng lồ kéo dài hàng giờ nhưng lại quên chạy tác vụ đó trong tmux hoặc screen. Việc này đang làm thiết bị đầu cuối của bạn bị chậm và nếu kết nối SSH của bạn bị rớt thì quá trình sẽ ngừng hoạt động. Sự hoảng loạn bắt đầu.
- Nhấn
CTRL + Zđể tạm dừng (tạm dừng) quá trình. - Nhập
bgđể cho phép nó tiếp tục chạy ở chế độ nền. Lời nhắc của bạn là miễn phí! - Nhập
disownđể tách nó hoàn toàn khỏi shell của bạn. Bạn có thể đóng máy tính xách tay của mình lại, uống cà phê một cách an toàn và quá trình này sẽ vẫn tiếp tục.
Trình ghi nhật ký mọi thứ
command |& tee file.log: Ống tiêu chuẩn (|) chỉ bắt được đầu ra tiêu chuẩn (stdout). Nếu một tập lệnh đưa ra lỗi (stderr), tập lệnh đó sẽ bỏ qua đường dẫn và xuất hiện trực tiếp trên màn hình của bạn, thiếu tệp nhật ký. |& ống dẫn cả stdout và stderr (đây là cách viết tắt hữu ích cho 2>&1 |).
Ném vào tee và bạn có thể xem kết quả đầu ra trên màn hình của mình đồng thời lưu nó vào tệp nhật ký. Việc này tương đương với việc xem TV trực tiếp trong khi ghi vào DVR của bạn.
Vỏ là một hộp công cụ, không phải một chướng ngại vật. Bạn không cần phải ghi nhớ tất cả những điều này ngày hôm nay. Chỉ chọn một thủ thuật, áp đặt nó vào thói quen hàng ngày của bạn trong một tuần, sau đó chọn một thủ thuật khác. Đừng để thiết bị đầu cuối đẩy bạn đi khắp nơi và bắt đầu sắp xếp lại đồ đạc. Bây giờ nó là nhà của bạn.
Tác giả: zdw