【MacOS】defaultsコマンドの使い方を調べました

defaultsコマンド MacOS

想定読者: defaultsコマンドが一体何者なのか説明できない人

この記事を読むと、defaultsコマンドの指定オプションが表す意味を理解することができます。Qiitaや技術ブログに記載されているdefaultsコマンドが行なっている内容もわかるようになると思います。

はじめに:MacでスクリーンショットをJPEG保存したかった

MacBookPro(macOS Catalina ver.10.15.2)でブログ記事用にスクリーンショット(⌘+Shift+4)を保存すると画像形式がPNGでした。GUIメニューから変更できずググると以下の記事を見つけ、ターミナルからJPEG形式に保存形式を変更することができました。

$ defaults write com.apple.screencapture type jpg

Macのスクリーンショットをjpgで保存する

やりたい事は上記で実現できたんですが、そもそもdefaultsコマンドって初めて見たぞ、これは何なんだ?どうやってこのコマンドオプションで実行すれば良いという発想に至れたんだろう、という疑問からdefaultsコマンドについて調べました。

defaultsコマンドとは?

defaultsコマンドの公式ドキュメントはmanコマンドで参照することができます。
(webサイトで調べても、Mac公式のdefaultsコマンドの説明記事を見つけれませんでした)

NAME
defaults — access the Mac OS X user defaults system

DESCRIPTION
Defaults allows users to read, write, and delete Mac OS X user defaults from a command-line shell. Mac OS X applications and other programs use the defaults system to record user preferences and other information that must be maintained when the applications aren’t running (such as default font for new documents, or the position of an Info panel). Much of this information is accessible through an application’s Preferences panel, but some of it isn’t, such as the position of the Info panel. You can access this information with defaults

$ man defaults より 抜粋

超訳:defaultsコマンドは、Mac OS Xのユーザーデフォルトシステムにアクセスし、デフォルト値を読み書き削除するためのものである。このコマンドはアプリが起動しなくなった場合にデフォルト値を書き換えることが想定される用途である。

このコマンドを使うことで、任意アプリの初期値を変更できるようです。defaultsコマンドは、Windowsで言うところのレジストリを書き換えるコマンド、と理解するとよさそうです。(つまり、下手に設定を書き換えると、アプリを起動できなくすることも可能。)

また、Max OS X user defaultsと明記されているように、このコマンドはMac固有のものであり、Windows, Linux, BSDには存在しなかったです。

Though all applications, system services, and other programs have their own domains, they also share a domain
named NSGlobalDomain. If a default isn’t specified in the application’s domain, but is specified in
NSGlobalDomain, then the application uses the value in that domain.

$ man defaults より 抜粋

超訳:全アプリ、システムサービス、他プログラムは、それぞれ個別にdomainを持っているが、”NSGlobalDomain”というdomainも共有している。もしあるアプリdomainの特定のデフォルト値が無い場合、”NSGlobalDomain”の値が採用される、とのこと。

domainという単語が重要で、デフォルト値を変更したいアプリのdomainを調べる必要があります。

defaults コマンドラインオプション

以下がdefaultsのコマンドラインオプションです。多いように見えますが、太字の2種類だけで十分です。[ ]の部分は省略可能を表しています。

readで変更したいdomainとkeyを特定し、write domain key ‘value’でデフォルト値を書き換えます。

$ defaults [-currentHost | -host hostname] read [domain [key]]
$ defaults [-currentHost | -host hostname] read-type domain key
$ defaults [-currentHost | -host hostname] write domain { ‘plist’ | key ‘value’ }
$ defaults [-currentHost | -host hostname] rename domain old_key new_key
$ defaults [-currentHost | -host hostname] delete [domain [key]]
$ defaults [-currentHost | -host hostname] { domains | find word | help }

readで変更したいdomainとkeyを特定する

以下のオプションで全アプリのユーザーデフォルト全体を取得することができます。
(下記どちらでもOK)

$ defaults read
$ defaults domains

全ユーザーデフォルトからgrepすることで、スクリーンショットアプリのdomainを調べることができます。(“com.apple.screencapture” )
domainが特定できれば、readオプションでスクリーンショットアプリのユーザーデフォルトがどのようなKey-Valueとなっているか取得できます。

$ defaults read | grep scree
    "com.apple.screencapture" =     {
    "com.apple.screencaptureui" =     {
    "com.apple.screensaver" =     {
        "com.apple.dtandsspref.lastselectedtab" = ...

$ defaults read com.apple.screencapture
 {
     "last-messagetrace-stamp" = "601982105.3191251";
     "last-selection" =     {
         Height = "787.5";
         Width = 1260;
         X = 111;
         Y = 0;
     };
     "last-selection-display" = 0;
     location = "~/Pictures";
     "location-last" = "~/Pictures";
     target = file;
     type = jpg;
 }

【再掲】
$ defaults write com.apple.screencapture type jpg

Macのスクリーンショットをjpgで保存する

本記事冒頭で引用したコマンドの、com.apple.screencaptureの意味、typeの意味を明らかにすることができました。

コメント