Những công cụ dòng lệnh macOS có thể bạn chưa biết
(saurabhs.org)- Chỉ với Terminal, bạn có thể xử lý các tính năng riêng của macOS như tiết kiệm năng lượng, clipboard, Finder, Spotlight và cập nhật, giúp giảm các thao tác GUI lặp lại
caffeinate,pmset,taskpolicytác động trực tiếp đến hành vi hệ thống, như ngăn máy ngủ, kiểm tra trạng thái nguồn và điều chỉnh mức ưu tiên chạy của tiến trình- Dùng
pbcopy,pbpaste,open,screencapture,saygiúp dễ đưa các tác vụ hằng ngày như clipboard, mở tệp, chụp màn hình và xuất giọng nói vào script sips,textutil,mdfind,mdlsđược dùng như công cụ xử lý tệp để tự động hóa chuyển đổi ảnh/tài liệu, tìm kiếm dựa trên Spotlight và kiểm tra metadatanetworkQuality,networksetup,softwareupdate,system_profilergiúp nhanh chóng kiểm tra chất lượng mạng, Wi‑Fi/DNS, cập nhật OS và thông tin phần cứng/phần mềm
Phạm vi các lệnh riêng cho macOS
- Ngoài các công cụ Unix tiêu chuẩn, macOS còn bao gồm các công cụ dòng lệnh chuyên dụng để truy cập chức năng của hệ điều hành
- Có thể xem cách dùng chi tiết của từng lệnh bằng
man <command> - Môi trường tham chiếu là macOS Sonoma
Nguồn điện, chế độ ngủ và điều khiển tiến trình
-
caffeinate- Ngăn Mac chuyển sang chế độ ngủ- Khi chạy
caffeinatemà không có flag hay đối số, Mac sẽ không chuyển sang trạng thái ngủ trong lúc lệnh đang chạy caffeinate -u -t <seconds>áp dụng ngăn ngủ trong số giây được chỉ định- Thêm flag
-dđể ngăn cả màn hình chuyển sang chế độ ngủ - Nếu chỉ định một tiến trình hiện có bằng
-w <pid>,caffeinatecũng sẽ kết thúc khi tiến trình đó kết thúc caffeinate <command>khởi chạy lệnh đã cho như một tiến trình mới và ngăn ngủ cho đến khi tiến trình đó kết thúc
- Khi chạy
-
pmset- Kiểm tra và điều khiển trạng thái quản lý nguồnpmset -gxuất ra thông tin thiết lập nguồn có sẵnpmset -g assertionshiển thị các assertion liên quan đến nguồn do tiến trình khác tạo ra, hữu ích để tìm tiến trình đang ngăn Mac ngủpmset -g thermloghiển thị thông tin về các tiến trình bị throttling, có thể tham khảo khi chạy benchmarkpmset displaysleepnowchuyển ngay chỉ màn hình sang trạng thái ngủ mà không cho toàn bộ hệ thống ngủpmset sleepnowchuyển ngay toàn bộ hệ thống sang trạng thái ngủ
-
taskpolicy- Điều khiển lập lịch tiến trìnhtaskpolicy -b <command>chạy lệnh đã cho ở nền; trên Mac Apple silicon, lệnh chỉ chạy trên các nhân tiết kiệm điệntaskpolicy -b -p <pid>hạ một tiến trình hiện có xuống chế độ chạy nềntaskpolicy -B -p <pid>loại bỏ trạng thái chạy nền của tiến trình được chỉ định- Trên Mac Apple silicon, sau đó tiến trình có thể chạy trên nhân tiết kiệm điện hoặc nhân hiệu năng
- Hành vi này chỉ áp dụng cho tiến trình đã bị hạ xuống nền, và không áp dụng cho tiến trình được khởi chạy ở nền ngay từ đầu
taskpolicy -s <command>khởi chạy lệnh đã cho ở trạng thái tạm dừng, cho phép gắn debugger vào thời điểm bắt đầu chạy
Clipboard, khởi chạy ứng dụng, chụp màn hình và xuất giọng nói
-
pbcopy,pbpaste- Sử dụng clipboard hệ thống<command> | pbcopysao chép kết quả xuất của lệnh vào clipboardpbpasteđưa nội dung clipboard ra standard output
-
open- Mở tệp và ứng dụngopen -a <app> <file>mở tệp được chỉ định bằng một ứng dụng cụ thể- Thêm flag
-gđể mở tệp ở nền trong khi vẫn giữ focus của ứng dụng hiện tại open .mở thư mục hiện tại trong một cửa sổ Finder mớiopen -R <file>hiển thị tệp được chỉ định trong một cửa sổ Finder mới
-
screencapture- Chụp màn hìnhscreencapture -cchụp màn hình và sao chép vào clipboardscreencapture <file>lưu ảnh chụp màn hình vào tệp được chỉ định- Thêm flag
-T <seconds>để chờ số giây được chỉ định rồi mới chụp
-
say- Chuyển văn bản thành giọng nóisay <message>phát thông điệp đã cho bằng giọng nóisay -f input.txt -o output.aifftạo audiobook từ tệp văn bản được chỉ định
Ảnh, tài liệu, tìm kiếm và metadata
-
sips- Thao tác ảnhsips -z <height> <width> <image>resize ảnh theo kích thước được chỉ định, bỏ qua tỷ lệ khung hình hiện cósips -Z <size> <image>giữ tỷ lệ khung hình và đặt cạnh dài nhất về kích thước được chỉ địnhsips -c <height> <width> <image>crop ảnh theo kích thước được chỉ định, lấy tâm ảnh gốc làm mốcsips -r <degrees> <image>xoay ảnh theo số độ được chỉ định- Hành vi mặc định là ghi đè phá hủy lên ảnh đầu vào, nên hãy dùng flag
-onếu cần đường dẫn đầu ra khác - Tệp đầu ra phải có cùng phần mở rộng tệp với ảnh đầu vào
-
textutil- Chuyển đổi tệp tài liệutextutilcó thể chuyển đổi tệp giữa các định dạng Microsoft Word, văn bản thuần, rich text và HTMLtextutil -convert html journal.docchuyển đổijournal.docthànhjournal.html- Các giá trị có thể dùng với
-convertlàtxt,html,rtf,rtfd,doc,docx
-
mdfind,mdls- Tìm kiếm Spotlight và metadatamdfind <query>thực hiện tìm kiếm từ khóa Spotlight với truy vấn đã chomdfind kMDItemAppStoreHasReceipt=1tìm tất cả ứng dụng được cài từ Mac App Storemdfind -name <name>tìm kiếm tất cả tệp khớp với tên được chỉ định- Có thể giới hạn phạm vi tìm kiếm vào một thư mục cụ thể bằng flag
-onlyin <dir> mdls <file-path>xuất toàn bộ metadata Spotlight gắn với tệp được chỉ định
Mạng, cập nhật và thông tin hệ thống
-
networkQuality- Đo tốc độ InternetnetworkQualitychạy bài kiểm tra tốc độ Internet trên Mac- Thêm flag
-vđể xem thông tin chi tiết hơn - Flag
-Ichạy bài kiểm tra trên một giao diện mạng cụ thể
-
networksetup- Kiểm tra và cấu hình thiết lập mạngnetworksetup -listnetworkserviceorderxuất danh sách các dịch vụ mạng có sẵnnetworksetup -getinfo <networkservice>hiển thị thông tin của dịch vụ mạng được chỉ địnhnetworksetup -getdnsservers <networkservice>xuất các DNS server của dịch vụ mạng được chỉ địnhnetworksetup -setairportnetwork <device> <network> [password]kết nối tới mạng Wi‑Fi được chỉ định- Trong hầu hết trường hợp, đối số
<device>là"en0"
-
softwareupdate- Quản lý cập nhật OSsoftwareupdate --listxuất các bản cập nhật phần mềm có sẵnsudo softwareupdate -iacài đặt tất cả bản cập nhật có sẵnsoftwareupdate --fetch-full-installer --full-installer-version <version>cố gắng tải bộ cài đặt đầy đủ của phiên bản macOS được chỉ định vào/Applications
-
system_profiler- Tra cứu thông tin hệ thống- Theo mặc định,
system_profilerxuất tất cả thông tin hệ thống có sẵn, và lượng output thường khá lớn system_profiler <datatype>chỉ xuất thông tin của hệ thống con được chỉ địnhsystem_profiler -listDataTypeshiển thị danh sách tất cả hệ thống con có thể lấy thông tin- Các kiểu dữ liệu hữu ích gồm:
system_profiler SPHardwareDataType: xuất tổng quan phần cứng của Mac hiện tại, tên model và số serialsystem_profiler SPSoftwareDataType: xuất tổng quan phần mềm của Mac hiện tại và số phiên bản macOS chính xácsystem_profiler SPPowerDataType: xuất thông tin nguồn và pin, bao gồm công suất AC hiện tại và số chu kỳ pinsystem_profiler SPDeveloperToolsDataType: xuất các công cụ phát triển Xcode hiện đang active và phiên bản SDK
- Theo mặc định,
5 bình luận
Những lệnh Terminal macOS nâng cao hữu ích cho cuộc sống hằng ngày (dành cho người dùng phổ thông)
https://www.youtube.com/watch?v=EhiqpFtmjig
Các lệnh CLI nâng cao của macOS
Tôi cũng đã đăng một bản tóm tắt của cùng bài này cách đây 7 tháng, nhưng bản tóm tắt bên này có vẻ đáng đọc hơn.. huhu
Có vẻ vì rút gọn đến mức như phần bạn tóm tắt là vẫn đủ để hiểu nên lại càng hay hơn ấy, haha
Không phải vậy đâu...... haha
Ý kiến trên Hacker News
Dùng sips cùng với iconutil thì có thể tạo tệp
.icnscho ứng dụng chỉ từ một ảnh PNG 1024×1024 mà không cần công cụ bên thứ baTạo iconset bằng
mkdir MyIcon.iconset, dùngsips -zđể tạo các kích thước 16/32/128/256/512 và các tệp@2x, rồi chạyiconutil -c icns MyIcon.iconsetThêm nữa, có thể tạo cả
.icobằngffmpeg -i MyIcon.iconset/icon_256x256.png icon.icoTuy vậy, vì cách
sipsthu nhỏ PNG, cũng khá tò mò không biết nên tạo bản 16px trực tiếp từ 1024px hay giảm dần từng bước từ 32px sẽ tốt hơncp, trước tiên có thể dùng qlmanage để tạo PNG 1024×1024qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svgTuy nhiên, nhìn vào các icon hệ thống của macOS thì có vẻ giờ đây họ cũng không còn chỉnh tay nữa
Trong danh sách này, đặc biệt thích pbcopy và pbpaste
Khi xử lý JSON đã nén, chỉ cần sang iTerm chạy
pbpaste | json_pp | pbcopylà đầu ra được format đẹp sẽ nằm ngay trên clipboard, rất tiệnpbpaste | something | pbcopy, nên rất đáng để gói nó thành một hàm shellCó thể dùng kiểu
pbfilter json_pp,pbfilter base64 -d,pbfilter sed 's/this/that/'Nếu chỉ chạy
pbfilterkhông có đối số, nó cũng có thể hoạt động như bộ lọc xóa định dạng trên clipboard và chỉ giữ lại văn bản thuần túyTuy nhiên, nó không dùng được với alias, pipeline hay biểu thức phức tạp; lệnh lọc phải là lệnh thông thường hoặc hàm cùng với các đối số của chúng
Ví dụ, các dòng trống kép sinh ra từ kiểu copy/paste của Windows có thể được xử lý bằng
alias winlines="sed '/^$/{$!{N;s/\n//;};}'"vàalias pbw="pbpaste | winlines | pbcopy"Trên Linux cũng có thể mô phỏng gần giống macOS bằng
alias pbcopy='xsel --clipboard --input',alias pbpaste='xsel --clipboard --output'Trên X11 có
xclip[0], trên Wayland cówl-clipboard[1], và chúng còn hỗ trợ cả định dạng tệp nhị phân thông qua phân tích header hoặc đặt MIME type tường minhVì vậy có thể sao chép ảnh từ terminal rồi dán vào chương trình GUI như trình duyệt hoặc ứng dụng chat, hoặc làm theo chiều ngược lại; cũng rất hữu ích cho các shell script tự động hóa desktop
Trên macOS thì cần một đường vòng là gọi AppleScript qua
osascriptrồi dùngset the clipboard to...[0] https://github.com/astrand/xclip
[1] https://github.com/bugaevc/wl-clipboard
Nếu sao chép văn bản trên điện thoại thì có thể lấy ngay vào dòng lệnh trên Mac bằng
pbpastepbpaste | vipe | pbcopyỞ đây vipe là tiện ích chèn một trình soạn thảo, thường là vim, vào giữa pipeline và có thể xem tại https://joeyh.name/code/moreutils/
Dù không phải công cụ dòng lệnh, Network Link Conditioner cũng cực kỳ hay
Nó có thể mô phỏng mạng cực tệ bằng cách thêm độ trễ, giới hạn băng thông, mất gói, v.v., nên rất hữu ích cho việc kiểm thử
Trong những cuộc họp bắt buộc phải bật camera, bạn thậm chí có thể cố tình làm kết nối tệ đi để xuất hiện video vỡ khối và giọng robot, rồi khi mọi người bảo tắt video thì mọi thứ lại “kỳ diệu” trở lại bình thường
https://developer.apple.com/download/all/
https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
Nó thiết lập các quy tắc để chèn độ trễ gói tin hoặc loại bỏ một tỷ lệ gói nhất định theo từng profile
Trên macOS, dùng
dnctlvàpfctlcó thể làm các việc tương tự, thậm chí còn nhiều hơn nữaCũng nên nhắc đến afplay để phát âm thanh
Bạn có thể dùng nó để tạo một trình phát MP3 dòng lệnh đơn giản
Ngoài ra còn có tiện ích
sayđể tổng hợp giọng nói, hỗ trợ định dạng TUNE nên có thể điều chỉnh toàn bộ giai điệu và nhịp của lời nói để khiến nó nghe như có cảm xúcApple có Speech Synthesis Programming Guide tại https://josh8.com/blog/img/speech-synthesis.pdf, và bài viết liên quan được tổng hợp tại https://josh8.com/blog/commandline-audio-mac.html
Thế hệ tổng hợp giọng nói cuối cùng hỗ trợ nó là giọng Alex được đưa vào năm 2007, và có vẻ khả năng nó xuất hiện trở lại là rất thấp
Việc điều khiển tổng hợp một cách tinh vi và độ tự nhiên vốn dĩ có quan hệ căng thẳng với nhau, và vế sau có giá trị lớn hơn nhiều
say -v '?'Nếu muốn tăng năng suất hoặc khi thuyết trình, tôi sẽ ẩn toàn bộ biểu tượng và thư mục trên desktop
Chạy
defaults write com.apple.finder CreateDesktop 0rồikillall Finderthì chúng sẽ bị ẩn, và đổi giá trị thành1thì sẽ hiện lạiTôi cũng đã tạo một bash alias để bật/tắt việc này, gist ở https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...
Dù vậy tôi vẫn dùng
~/Desktopthường xuyên, nên đó là một trong hai thư mục tôi ghim vào Dock; thư mục còn lại là~/DownloadsMặt khác, việc macOS có Stacks trên desktop là rất tuyệt, và đó là tính năng tôi luôn chỉ cho những ai có desktop bừa bộn đầy file
Cũng đáng để gom nó chung với các thiết lập khác có thể hữu ích trong lúc thuyết trình
Danh sách này rất hay, và còn có hidutil nữa
https://developer.apple.com/library/archive/technotes/tn2450...
Ví dụ, trên bàn phím PC bạn có thể đổi phím
Insgần như vô dụng trên macOS thành một phím nhưPC Execute, rồi bắt nó trong Keyboard Maestro để remap tiếphidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}', bạn có thể đổi phímparagraphở góc trên bên trái của bàn phím kiểu châu Âu thành phím backtick hữu ích hơnhttps://hidutil-generator.netlify.app/
Ví dụ, bạn có thể tháo ổ USB bằng
hdiutil detach /Volumes/some-usb-drive, hoặc tạo ISO bằnghdiutil makehybrid -joliet -o foo.iso ./srcfolder/Vài năm trước tôi từng viết một script để tìm thứ gì đó trong một khối dữ liệu lớn và báo cho tôi khi xong, rồi thêm lệnh say vào cuối
Tôi quên mất chuyện đó rồi ngủ thiếp đi, vài tiếng sau thì bật dậy vì nghe thấy một giọng trong phòng làm việc tại nhà như thể một “kẻ đột nhập” đang nói với đồng bọn, và chỉ thực sự yên tâm hẳn sau khi nhận ra chuyện gì đang xảy ra
pushnhận tiêu đề và phần thân tùy chọnNó khá tiện để dùng kiểu
./longRunningCommand && push "Task Done" "Here is a body", và khi ở trước máy tính tôi cũng dùng nó cùng với một scriptbeepchỉ phát ra tiếng báo hoàn tấtsaytrên máy Mac sau khi xâm nhậpTôi chưa từng thấy ai dùng nó ngoài đời, nhưng đôi lúc vẫn mong chờ một chuỗi Twitter mở đầu bằng câu “tôi đã dùng module msf gọi
saytrên laptop của khách hàng”Vì vậy tôi đã thêm một script hoàn tất lệnh trong fish phát tiếng bíp bằng
afplaynếu tác vụ mất hơn 5 giâyNó giúp tôi lấy lại sự tập trung với những tác vụ “chỉ vừa đủ dài để bị quên mất”
Tiện ích dòng lệnh diskutil của macOS cũng rất đáng khen
Hôm nay tôi gặp sự cố với một vài phân vùng trên đĩa mà Disk Utility đồ họa của macOS không sửa được, đó là tàn dư còn lại từ lần trước tôi thử chạy Asahi Linux
Tôi đoán là CLI
diskutilsẽ có cách xử lý, và đã tìm được lời giải trong thread sauhttps://apple.stackexchange.com/questions/411544/cant-reclai...
Giờ tôi có thể dùng lại toàn bộ ổ đĩa cho macOS
diskutilrất tuyệt, nhưng việc Disk Utility.app thành ra như hiện tại thì thật thảm hạiTừ sau khi chuyển sang APFS, nó dường như không được chăm sóc tử tế, và có những việc
diskutillàm được mà ứng dụng GUI lại thất bại hoàn toànTrước khi giao diện được thiết kế lại, nó là một công cụ vững vàng, dù thất bại thì ít nhất cũng cho biết vì sao; còn bây giờ nó giống một giao diện LEGO Duplo cho trẻ con chỉ đủ sức format ổ flash drive
Khi không nhớ lệnh hay tham số, um cũng đáng để xem qua
https://github.com/promptops/cli
Ví dụ, nhập
um prevent my mac from sleeping for 30msẽ cho ra kết quả nhưcaffeinate -u -t 1800open là một lệnh đơn giản nhưng hay và tôi dùng thường xuyên
Tạo sẵn như
alias tab='open . -a iterm',alias phpstorm='open -a "PhpStorm"',alias smerge='open -a "Sublime Merge"', và tôi dùng chúng còn thường xuyên hơn cả hộp thoại Open/Recents của từng ứng dụngopen -a ...đã tệ hại suốt nhiều năm vì Apple không cập nhật định nghĩa completionTôi đã để lại một cách lách ở câu trả lời Stack Overflow này: https://stackoverflow.com/a/63097652
-nNó cho phép chạy nhiều instance của cùng một ứng dụng, và trước đây từng là tiện ích cá nhân tôi dùng nhiều nhất
Dạo gần đây tần suất dùng giảm đi vì số ứng dụng có vấn đề thiết kế nghiêm trọng đến mức đó đã ít hơn
Có thể dùng
/Applications/Sublime Merge.app/Contents/SharedSupport/bin/smergevà/Applications/Sublime Text.app/Contents/SharedSupport/bin/sublhttps://github.com/davatorium/rofi
Giao diện trông như https://i.imgur.com/Hm9TGeV.jpg
Trong terminal của VS Code, nếu dùng bí danh
othì nó sẽ mở từ vị trí hiện tại, rồi từ đó có thể tìm tệp và mở trong trình soạn thảoalias finder='open .'