13 ポイント 投稿者 GN⁺ 2023-06-28 | 5件のコメント | WhatsAppで共有
  • ターミナルだけでスリープ、クリップボード、Finder、Spotlight、アップデートといった macOS 固有の機能 を扱えるため、GUI での反復作業を減らせる
  • caffeinatepmsettaskpolicy は、スリープ防止や電源状態の確認、プロセス実行優先度の調整のように システム動作 に直接影響する
  • pbcopypbpasteopenscreencapturesay を使えば、クリップボード、ファイルを開く、スクリーンショット、音声出力といった 日常作業 をスクリプトに組み込みやすい
  • sipstextutilmdfindmdls は、画像・文書の変換や Spotlight ベースの検索、メタデータ確認を自動化する ファイル処理ツール として活用できる
  • networkQualitynetworksetupsoftwareupdatesystem_profiler は、ネットワーク品質、Wi‑Fi/DNS、OS アップデート、ハードウェア・ソフトウェア情報をすばやく点検できる

macOS 専用コマンドの範囲

  • macOS には標準 Unix ツールに加えて、OS の機能にアクセスする 専用コマンドラインツール が含まれている
  • 各コマンドの詳しい使い方は man <command> で確認できる
  • 基準環境は macOS Sonoma

電源、スリープ、プロセス制御

  • caffeinate - Mac のスリープ防止

    • caffeinate をフラグや引数なしで実行すると、コマンドの実行中は Mac がスリープ状態に入らない
    • caffeinate -u -t <seconds> は、指定した秒数の間 スリープ防止 を適用する
    • -d フラグを追加するとディスプレイのスリープも防ぐ
    • -w <pid> で既存プロセスを指定すると、そのプロセスが終了したときに caffeinate も一緒に終了する
    • caffeinate <command> は、与えられたコマンドを新しいプロセスとして開始し、そのプロセスが終わるまでスリープを防止する
  • pmset - 電源管理状態の確認と制御

    • pmset -g は利用可能な 電源設定情報 を出力する
    • pmset -g assertions は、ほかのプロセスが作成した電源関連 assertion を表示し、Mac のスリープを妨げているプロセスを探すのに役立つ
    • pmset -g thermlog はスロットリングされたプロセス情報を表示し、ベンチマーク実行時の参考になる
    • pmset displaysleepnow はシステム全体をスリープさせず、ディスプレイだけを即座にスリープ状態へ切り替える
    • pmset sleepnow はシステム全体を即座にスリープ状態へ切り替える
  • taskpolicy - プロセススケジューリング制御

    • taskpolicy -b <command> は、与えられたコマンドを バックグラウンド で実行し、Apple silicon Mac では効率コアのみで実行される
    • taskpolicy -b -p <pid> は既存プロセスをバックグラウンド実行へ落とす
    • taskpolicy -B -p <pid> は指定したプロセスのバックグラウンド実行状態を解除する
      • Apple silicon Mac では、その後は効率コアまたは性能コアで実行されうる
      • この動作はバックグラウンドへ落とされたプロセスにのみ適用され、最初からバックグラウンドで開始したプロセスには適用されない
    • taskpolicy -s <command> は、与えられたコマンドを 一時停止状態 で開始し、実行開始時点でデバッガをアタッチできるようにする

クリップボード、アプリ起動、スクリーンショット、音声出力

  • pbcopy, pbpaste - システムクリップボードの利用

    • <command> | pbcopy はコマンド出力結果を クリップボード にコピーする
    • pbpaste はクリップボードの内容を標準出力へ出力する
  • open - ファイルとアプリケーションを開く

    • open -a <app> <file> は指定したファイルを特定のアプリケーションで開く
    • -g フラグを追加すると、現在のアプリケーションのフォーカスを維持したままファイルを バックグラウンド で開く
    • open . は現在のディレクトリを新しい Finder ウインドウで開く
    • open -R <file> は指定したファイルを新しい Finder ウインドウで表示する
  • screencapture - スクリーンショット撮影

    • screencapture -c はスクリーンショットを撮って クリップボード にコピーする
    • screencapture <file> はスクリーンショットを指定したファイルに保存する
    • -T <seconds> フラグを追加すると、指定した秒数だけ待ってから撮影する
  • say - テキスト読み上げ

    • say <message> は、与えられたメッセージを音声で出力する
    • say -f input.txt -o output.aiff は指定したテキストファイルから オーディオブック を生成する

画像、文書、検索とメタデータ

  • sips - 画像操作

    • sips -z <height> <width> <image> は既存の縦横比を無視して画像を指定サイズにリサイズする
    • sips -Z <size> <image> は縦横比を維持したまま最長辺を指定サイズに合わせる
    • sips -c <height> <width> <image> は元画像の中央を基準に指定サイズへ クロップ する
    • sips -r <degrees> <image> は画像を指定した角度だけ回転する
    • 既定の動作では入力画像を 破壊的に上書き するため、別の出力パスが必要な場合は -o フラグを使う
    • 出力ファイルは入力画像と同じ拡張子である必要がある
  • textutil - 文書ファイル変換

    • textutil は Microsoft Word、プレーンテキスト、リッチテキスト、HTML フォーマットの間でファイルを変換できる
    • textutil -convert html journal.docjournal.docjournal.html に変換する
    • -convert に使用できる値は txthtmlrtfrtfddocdocx
  • mdfind, mdls - Spotlight 検索とメタデータ

    • mdfind <query> は指定したクエリで Spotlight キーワード検索 を実行する
    • mdfind kMDItemAppStoreHasReceipt=1 は Mac App Store からインストールされたすべてのアプリを探す
    • mdfind -name <name> は指定した名前と一致するすべてのファイルを検索する
    • -onlyin <dir> フラグで検索範囲を特定のディレクトリに限定できる
    • mdls <file-path> は指定したファイルに関連付けられたすべての Spotlight メタデータを出力する

ネットワーク、アップデート、システム情報

  • networkQuality - インターネット速度測定

    • networkQuality は Mac で インターネット速度テスト を実行する
    • -v フラグを追加すると、より詳しい情報を見られる
    • -I フラグは特定のネットワークインターフェースでテストを実行する
  • networksetup - ネットワーク設定の確認と構成

    • networksetup -listnetworkserviceorder は利用可能なネットワークサービスの一覧を出力する
    • networksetup -getinfo <networkservice> は指定したネットワークサービスの情報を表示する
    • networksetup -getdnsservers <networkservice> は指定したネットワークサービスの DNS サーバーを出力する
    • networksetup -setairportnetwork <device> <network> [password] は指定した Wi‑Fi ネットワークに接続する
    • 多くの場合、<device> 引数は "en0"
  • softwareupdate - OS アップデート管理

    • softwareupdate --list は利用可能な ソフトウェアアップデート を出力する
    • sudo softwareupdate -ia は利用可能なすべてのアップデートをインストールする
    • softwareupdate --fetch-full-installer --full-installer-version <version> は、指定した macOS バージョンのフルインストーラを /Applications にダウンロードしようとする
  • system_profiler - システム情報の取得

    • system_profiler は既定で利用可能なすべてのシステム情報を出力し、出力量は概して多い
    • system_profiler <datatype> は指定したサブシステム情報だけを出力する
    • system_profiler -listDataTypes は、情報を取得できるすべてのサブシステム一覧を表示する
    • 便利なデータタイプは次のとおり
      • system_profiler SPHardwareDataType: 現在の Mac のハードウェア概要、モデル名、シリアル番号を出力する
      • system_profiler SPSoftwareDataType: 現在の Mac のソフトウェア概要と正確な macOS バージョン番号を出力する
      • system_profiler SPPowerDataType: 現在の AC 電力値とバッテリーサイクル数を含む電源・バッテリー情報を出力する
      • system_profiler SPDeveloperToolsDataType: 現在有効な Xcode 開発ツールと SDK バージョンを出力する

5件のコメント

 
dansepo 2023-07-07

人生の役に立つMacBookのちょっと高度なターミナルコマンド集(一般向け)
https://www.youtube.com/watch?v=EhiqpFtmjig

 
xguru 2023-06-28

macOSの高度なCLIコマンド

同じ記事を私が7か月前に要約して投稿したことがあるのですが、こちらの要約のほうがもっと読み応えがありますね.. うう

 
edunga1 2023-06-28

要約してくださった程度まで短くしても理解するのに無理がないので、むしろそのほうがいいですね(笑)

 
botplaysdice 2023-06-28

そうではありません……(笑)

 
GN⁺ 2023-06-28
Hacker Newsのコメント
  • sipsiconutil を組み合わせると、サードパーティーツールなしで 1024×1024 の PNG 1枚からアプリ用の .icns ファイルを作成できる
    mkdir MyIcon.iconset でアイコンセットを作り、sips -z で 16/32/128/256/512 サイズと @2x ファイルを生成してから、iconutil -c icns MyIcon.iconset を実行すればよい
    おまけに ffmpeg -i MyIcon.iconset/icon_256x256.png icon.ico.ico も作れる
    ただ、sips が PNG を縮小する方式を考えると、16px 版を 1024px から直接作るのがよいのか、32px から段階的に縮小するのがよいのかは気になる

    • 元ファイルが SVG なら、cp の代わりにまず qlmanage を使って 1024×1024 の PNG を作れる
      qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svg
    • 本当に見栄えのよい小さなアイコン、特に 16×1632×32 を求めるなら、縮小後に手で調整したほうがシャープになる
      ただ、macOS のシステムアイコンを見る限り、最近はもう手作業で調整していないようにも思える
  • この一覧の中では pbcopypbpaste が特に気に入っている
    圧縮された JSON を扱うときは、iTerm に移って pbpaste | json_pp | pbcopy を実行すると、整形済みの出力がクリップボードに入るのでとても便利だ

    • pbpaste | something | pbcopy というパターンをよく使うので、シェル関数にしておく価値がある
      pbfilter json_pp, pbfilter base64 -d, pbfilter sed 's/this/that/' のように使える
      引数なしで pbfilter だけを実行すると、クリップボードの書式を取り除いてプレーンテキストだけを残すフィルターとしても動く
      ただし、エイリアスやパイプライン、複雑な式には使えず、フィルターコマンドは通常のコマンドまたは関数とその引数である必要がある
    • この流れはテキストの問題を解決する強力でクリーンな方法だ
      たとえば、Windows 風のコピー&ペーストで生じる二重空行は alias winlines="sed '/^$/{$!{N;s/\n//;};}'"alias pbw="pbpaste | winlines | pbcopy" で整理できる
      Linux でも alias pbcopy='xsel --clipboard --input', alias pbpaste='xsel --clipboard --output' とすれば macOS 風にまねできる
    • これらが プレーンテキストRTF でしか動かないのはかなりいら立たしい
      X11 には xclip[0]、Wayland には wl-clipboard[1] があり、ヘッダー解析や明示的な MIME タイプ指定によってバイナリファイル形式もサポートしている
      そのため、ターミナルから画像をコピーしてブラウザーやチャットクライアントのような GUI プログラムに貼り付けたり、その逆を行ったりでき、デスクトップ自動化シェルスクリプトにも役立つ
      macOS では osascript で AppleScript を呼び出し、set the clipboard to... を使うという回避策が必要になる
      [0] https://github.com/astrand/xclip
      [1] https://github.com/bugaevc/wl-clipboard
    • スマートフォンと一緒に pbcopy/pbpaste を使えるのもすばらしい
      スマートフォンでテキストをコピーすると、Mac のコマンドラインからすぐに pbpaste で取り出せる
    • クリップボードの内容を編集するときは pbpaste | vipe | pbcopy を使っている
      ここで vipe はパイプの途中にエディター、たいていは vim を差し込むユーティリティで、https://joeyh.name/code/moreutils/ で見られる
  • コマンドラインツールではないが、Network Link Conditioner も本当に優れている
    遅延、帯域幅、パケットロスなどを加えて非常に劣悪なネットワークをシミュレートできるので、テストに役立つ
    カメラを必ずオンにしろと言われる会議でも、接続をわざとひどい状態にしてブロックノイズだらけの映像やロボットのような音声を見せたうえで、全員がビデオを切れと言い出したら「魔法のように」正常化させることもできる

    • Comcast も macOS、BSD、Linux で同じことができ、名前も秀逸だ
    • Toxiproxy は別の環境で使える類似ツールで、タイムアウト、リトライ、パケットロスのような劣悪な条件下でネットワークコードをテストし改善するのに役立った
    • こんなツールがあるとは知らなかったし、「additional tools for X-Code」パッケージの中にも知らなかった便利なツールがまだいろいろある
      https://developer.apple.com/download/all/
    • Linux ではネットワーク QoS ツール を使って、達人級のやり方で似たことができる
      https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
    • NLC は dummynet と PF(packet filter) を制御する GUI インターフェースだ
      プロファイルに応じてパケット遅延を注入したり、一定割合のパケットをドロップするルールを設定したりする
      macOS では dnctlpfctl を使えば、同様のこと、さらにそれ以上のことも可能だ
  • オーディオ再生用の afplay もぜひ触れておくべき
    これで簡単なコマンドライン MP3 プレーヤーを作れる
    音声合成用の say ユーティリティもあり、TUNE 形式をサポートしているので、発話全体のメロディーやタイミングを調整して、感情がこもっているように聞かせることができる
    Apple の Speech Synthesis Programming Guide は https://josh8.com/blog/img/speech-synthesis.pdf にあり、関連する記事は https://josh8.com/blog/commandline-audio-mac.html にまとまっている

    • 残念ながら TUNE 形式 は進化の行き止まりに近かった
      これをサポートした最後の世代の音声合成は 2007 年に含まれていた Alex 音声で、再び目にする可能性はかなり低そう
      合成を精密に制御することと自然さは本質的に緊張関係にあり、後者のほうがはるかに価値が高い
    • 細かい訂正をひとつすると、音声一覧を見るコマンドは say -v '?' です
  • 生産性を上げたいときや発表するときは、デスクトップのアイコンとフォルダをすべて隠している
    defaults write com.apple.finder CreateDesktop 0 のあとに killall Finder を実行すると隠れ、値を 1 に戻せば再表示される
    これを切り替える bash エイリアスも作ってあり、gist は https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d... にある

    • 新しい Mac を設定するときに最初にやることのひとつが デスクトップを無効化すること
      それでも ~/Desktop はよく使うので、Dock に置いている 2 つのフォルダのうちの 1 つで、もう 1 つは ~/Downloads
      一方で、macOS のデスクトップに Stacks が入ったのは素晴らしく、デスクトップがファイルで散らかっている人にはいつも見せている機能
    • この方法を 10 年以上使っていて、教師だった頃にはキー操作にも割り当てていた
      発表時に役立ちそうなほかの設定とまとめておくとよい
  • 良いリストだし、hidutil もある
    https://developer.apple.com/library/archive/technotes/tn2450...
    たとえば PC キーボードで、macOS ではほとんど役に立たない Ins キーを PC Execute のようなキーに変えてから、Keyboard Maestro で拾って再マッピングできる

    • hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}' で、欧州配列キーボードの左上にある paragraph キーを、より便利な backtick に変えられる
    • こうしたマッピングを作ってくれる、なかなか良いジェネレーターがある
      https://hidutil-generator.netlify.app/
    • hidutilhdiutil は混同しないように
      たとえば hdiutil detach /Volumes/some-usb-drive で USB ドライブを取り外したり、hdiutil makehybrid -joliet -o foo.iso ./srcfolder/ で ISO を作れたりする
  • 数年前、大きなデータの塊から何かを探し、終わったら知らせてくれるスクリプトを作ったとき、最後に say コマンドを入れておいたことがある
    それを忘れたまま寝てしまい、数時間後にホームオフィスから「侵入者」が共犯者に話しかけるような声で飛び起きて、何が起きたのか分かってからようやく心底ほっとした

    • いくつかの通知に Pushover を使っているので、以前、タイトルと任意の本文を受け取る push という小さな bash スクリプトを作った
      ./longRunningCommand && push "Task Done" "Here is a body" のように使えて便利で、PC の前にいるときは完了を知らせる音だけを鳴らす beep スクリプトとも一緒に使っていた
    • こういう用途には StarCraft の research complete サンプルを使うのが好き
    • 同様に、侵入後の Mac で say コマンドを実行させる Metasploit モジュールもある
      実際に使われているのは見たことがないけれど、いつか「顧客のノート PC で say を呼ぶ msf モジュールを使った」で始まる Twitter スレッドが出てくるのを期待してしまう
    • ターミナルのタブをいくつも開いていると、時間のかかるコマンドを走らせたまま別タブに移動して忘れてしまいがち
      なので、処理に 5 秒以上 かかったら afplay でビープ音を鳴らす fish のコマンド完了スクリプトを追加した
      「ちょうど忘れるくらいの長さ」の作業で集中を戻すのに役立つ
    • 音声をアーノルドの声に変えられるなら、かなりのお金を払ってもいい
  • macOS の diskutil コマンドラインユーティリティも称賛に値する
    今日、ディスクのあるスライスに問題があったが、macOS のグラフィカルな Disk Utility では修復できず、以前 Asahi Linux を試したときの残骸だった
    diskutil CLI で解決する方法があるはずだと思い、次のスレッドで解決策を見つけた
    https://apple.stackexchange.com/questions/411544/cant-reclai...
    これでディスク全体を再び macOS で使えるようになった

    • diskutil は素晴らしいが、Disk Utility.app がこんな状態になってしまったのは痛ましい
      APFS への移行以降きちんと手入れされておらず、diskutil ならできる作業を GUI アプリでは完全に失敗することがある
      インターフェースの再設計前は、失敗してもその理由を教えてくれる堅実なツールだったのに、今ではフラッシュドライブのフォーマットくらいしかろくにできない、子ども向けの LEGO Duplo みたいなインターフェースになってしまった
  • コマンドや引数を思い出せないときは、umも見てみる価値がある
    https://github.com/promptops/cli
    たとえば um prevent my mac from sleeping for 30m と入力すると、caffeinate -u -t 1800 のような結果を返してくれる

  • open はいつも使う、シンプルで優れたコマンド
    alias tab='open . -a iterm', alias phpstorm='open -a "PhpStorm"', alias smerge='open -a "Sublime Merge"' のように作っておくと、各アプリの Open/Recents ダイアログよりも頻繁に使う

    • open -a ... のタブ補完は、Apple が補完定義を更新していないせいで、ここ数年ずっとひどいまま
      この Stack Overflow の回答に回避策を書いておいた: https://stackoverflow.com/a/63097652
    • 言及されていないフラグとして -n もある
      同じアプリケーションを 複数インスタンス で実行できるようにしてくれて、以前は個人的に最もよく使っていたユーティリティだった
      最近はそれほど深刻な設計上の問題を抱えたアプリが減ったので、使う頻度も下がった
    • Sublime Text と Sublime Merge はデフォルトで CLI ユーティリティを同梱しており、追加機能もある
      /Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl が使える
    • ファイルを rofi で開くためのスクリプトを作った
      https://github.com/davatorium/rofi
      見た目は https://i.imgur.com/Hm9TGeV.jpg のような感じ
      VS Code のターミナルでは、エイリアス o を使えば現在位置から開けて、そこからファイルを探してエディタで開ける
    • ターミナルの現在のディレクトリで新しい Finder ウィンドウを開くには、alias finder='open .' を使えばよい