13 điểm bởi GN⁺ 2023-06-28 | 5 bình luận | Chia sẻ qua WhatsApp
  • 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, taskpolicy tá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, say giú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 metadata
  • networkQuality, networksetup, softwareupdate, system_profiler giú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 caffeinate mà 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>, caffeinate cũ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
  • pmset - Kiểm tra và điều khiển trạng thái quản lý nguồn

    • pmset -g xuất ra thông tin thiết lập nguồn có sẵn
    • pmset -g assertions hiể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 thermlog hiển thị thông tin về các tiến trình bị throttling, có thể tham khảo khi chạy benchmark
    • pmset displaysleepnow chuyể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 sleepnow chuyể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ình

    • taskpolicy -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ện
    • taskpolicy -b -p <pid> hạ một tiến trình hiện có xuống chế độ chạy nền
    • taskpolicy -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> | pbcopy sao chép kết quả xuất của lệnh vào clipboard
    • pbpaste đưa nội dung clipboard ra standard output
  • open - Mở tệp và ứng dụng

    • open -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ới
    • open -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ình

    • screencapture -c chụp màn hình và sao chép vào clipboard
    • screencapture <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ói

    • say <message> phát thông điệp đã cho bằng giọng nói
    • say -f input.txt -o output.aiff tạ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 ảnh

    • sips -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ỉ định
    • sips -c <height> <width> <image> crop ảnh theo kích thước được chỉ định, lấy tâm ảnh gốc làm mốc
    • sips -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 -o nế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ệu

    • textutil có thể chuyển đổi tệp giữa các định dạng Microsoft Word, văn bản thuần, rich text và HTML
    • textutil -convert html journal.doc chuyển đổi journal.doc thành journal.html
    • Các giá trị có thể dùng với -converttxt, html, rtf, rtfd, doc, docx
  • mdfind, mdls - Tìm kiếm Spotlight và metadata

    • mdfind <query> thực hiện tìm kiếm từ khóa Spotlight với truy vấn đã cho
    • mdfind kMDItemAppStoreHasReceipt=1 tìm tất cả ứng dụng được cài từ Mac App Store
    • mdfind -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 độ Internet

    • networkQuality chạ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 -I chạ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ạng

    • networksetup -listnetworkserviceorder xuất danh sách các dịch vụ mạng có sẵn
    • networksetup -getinfo <networkservice> hiển thị thông tin của dịch vụ mạng được chỉ định
    • networksetup -getdnsservers <networkservice> xuất các DNS server của dịch vụ mạng được chỉ định
    • networksetup -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>"en0"
  • softwareupdate - Quản lý cập nhật OS

    • softwareupdate --list xuất các bản cập nhật phần mềm có sẵn
    • sudo softwareupdate -ia cài đặt tất cả bản cập nhật có sẵn
    • softwareupdate --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_profiler xuấ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ỉ định
    • system_profiler -listDataTypes hiể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ố serial
      • system_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ác
      • system_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ỳ pin
      • system_profiler SPDeveloperToolsDataType: xuất các công cụ phát triển Xcode hiện đang active và phiên bản SDK

5 bình luận

 
dansepo 2023-07-07

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

 
xguru 2023-06-28

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

 
edunga1 2023-06-28

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

 
botplaysdice 2023-06-28

Không phải vậy đâu...... haha

 
GN⁺ 2023-06-28
Ý kiến trên Hacker News
  • Dùng sips cùng với iconutil thì có thể tạo tệp .icns cho ứng dụng chỉ từ một ảnh PNG 1024×1024 mà không cần công cụ bên thứ ba
    Tạo iconset bằng mkdir MyIcon.iconset, dùng sips -z để tạo các kích thước 16/32/128/256/512 và các tệp @2x, rồi chạy iconutil -c icns MyIcon.iconset
    Thêm nữa, có thể tạo cả .ico bằng ffmpeg -i MyIcon.iconset/icon_256x256.png icon.ico
    Tuy vậy, vì cách sips thu 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ơn

    • Nếu tệp đầu vào là SVG thì thay vì cp, trước tiên có thể dùng qlmanage để tạo PNG 1024×1024
      qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svg
    • Nếu muốn các biểu tượng nhỏ thật sự đẹp mắt, đặc biệt là 16×16 hoặc 32×32, thì sau khi thu nhỏ vẫn nên chỉnh tay để hình sắc nét hơn
      Tuy 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 pbcopypbpaste
    Khi xử lý JSON đã nén, chỉ cần sang iTerm chạy pbpaste | json_pp | pbcopy là đầu ra được format đẹp sẽ nằm ngay trên clipboard, rất tiện

    • Vì thường xuyên dùng mẫu pbpaste | something | pbcopy, nên rất đáng để gói nó thành một hàm shell
      Có thể dùng kiểu pbfilter json_pp, pbfilter base64 -d, pbfilter sed 's/this/that/'
      Nếu chỉ chạy pbfilter khô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úy
      Tuy 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
    • Luồng này là một cách mạnh mẽ và gọn gàng để giải quyết các vấn đề về văn bản
      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//;};}'"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'
    • Khá khó chịu ở chỗ chúng chỉ hoạt động với văn bản thuầnRTF
      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 minh
      Vì 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 osascript rồi dùng set the clipboard to...
      [0] https://github.com/astrand/xclip
      [1] https://github.com/bugaevc/wl-clipboard
    • Dùng pbcopy/pbpaste cùng điện thoại cũng rất hay
      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 pbpaste
    • Khi muốn chỉnh sửa nội dung clipboard, có thể dùng pbpaste | 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

    • Comcast cũng làm được điều tương tự trên macOS, BSD và Linux, mà cái tên thì quá xuất sắc
    • Toxiproxy là một công cụ tương tự có thể dùng ở môi trường khác, và đã giúp kiểm thử cũng như cải thiện mã mạng trong các điều kiện tệ như timeout, retry và mất gói
    • Trước giờ không biết có những công cụ như thế này, và trong gói “additional tools for X-Code” cũng còn nhiều công cụ hay ho khác mà trước đây chưa biết
      https://developer.apple.com/download/all/
    • Trên Linux, có thể làm điều tương tự theo kiểu cực kỳ chuyên sâu bằng các công cụ QoS mạng
      https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
    • NLC là giao diện GUI để điều khiển dummynet và PF(packet filter)
      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 dnctlpfctl có thể làm các việc tương tự, thậm chí còn nhiều hơn nữa
  • Cũ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úc
    Apple 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

    • Đáng tiếc là định dạng TUNE gần như là một ngõ cụt về mặt tiến hóa
      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
    • Một chỉnh sửa nhỏ: lệnh để xem danh sách giọng nói là 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 0 rồi killall Finder thì chúng sẽ bị ẩn, và đổi giá trị thành 1 thì sẽ hiện lại
    Tôi cũng đã tạo một bash alias để bật/tắt việc này, gist ở https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...

    • Một trong những việc đầu tiên tôi làm khi thiết lập Mac mới là tắt desktop
      Dù vậy tôi vẫn dùng ~/Desktop thườ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à ~/Downloads
      Mặ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
    • Tôi đã dùng cách này hơn 10 năm, và hồi còn làm giáo viên thì còn gán nó vào một tổ hợp phím
      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 Ins gầ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ếp

    • Với hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}', bạn có thể đổi phím paragraph ở 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ơn
    • Có một trình tạo khá ổn để tạo các mapping kiểu này
      https://hidutil-generator.netlify.app/
    • Đừng nhầm hidutil với hdiutil
      Ví dụ, bạn có thể tháo ổ USB bằng hdiutil detach /Volumes/some-usb-drive, hoặc tạo ISO bằng hdiutil 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

    • Tôi dùng Pushover cho một vài loại thông báo, nên trước đây đã viết một script bash nhỏ tên là push nhận tiêu đề và phần thân tùy chọn
      Nó 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 script beep chỉ phát ra tiếng báo hoàn tất
    • Tôi thích dùng mẫu âm thanh research complete của StarCraft cho mục đích này
    • Tương tự, cũng có một module Metasploit dùng để chạy lệnh say trên máy Mac sau khi xâm nhập
      Tô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 say trên laptop của khách hàng”
    • Nếu mở nhiều tab terminal, rất dễ chạy một lệnh lâu rồi chuyển sang tab khác và quên mất
      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 afplay nếu tác vụ mất hơn 5 giây
      Nó 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”
    • Nếu có thể đổi giọng sang giọng Arnold thì tôi sẵn sàng trả khá nhiều tiền
  • 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 diskutil sẽ có cách xử lý, và đã tìm được lời giải trong thread sau
    https://apple.stackexchange.com/questions/411544/cant-reclai...
    Giờ tôi có thể dùng lại toàn bộ ổ đĩa cho macOS

    • diskutil rất tuyệt, nhưng việc Disk Utility.app thành ra như hiện tại thì thật thảm hại
      Từ 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 diskutil làm được mà ứng dụng GUI lại thất bại hoàn toàn
      Trướ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 30m sẽ cho ra kết quả như caffeinate -u -t 1800

  • open 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ụng

    • Tự động hoàn thành bằng tab cho open -a ... đã tệ hại suốt nhiều năm vì Apple không cập nhật định nghĩa completion
      Tôi đã để lại một cách lách ở câu trả lời Stack Overflow này: https://stackoverflow.com/a/63097652
    • Trong số các cờ chưa được nhắc đến còn có -n
      Nó 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
    • Sublime Text và Sublime Merge mặc định đi kèm tiện ích CLI, đồng thời còn có thêm tính năng bổ sung
      Có thể dùng /Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl
    • Tôi đã tạo một script để mở tệp bằng rofi
      https://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 o thì 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ảo
    • Nếu muốn mở cửa sổ Finder mới tại thư mục hiện tại của terminal thì chỉ cần dùng alias finder='open .'