読者です 読者をやめる 読者になる 読者になる

osx yosemite,デスクトップイメージをコマンドラインから変更するニワ

tech macos settings shellscript

と言う事でして相も変わらず,誰の興味も惹かず,役にも立たないようなお話ですwww

# デスクトップを変更する.
desktopPicture="/Library/Desktop Pictures/Solid Colors/Solid Gray Pro Ultra Dark.png"
osascript -e 'tell application "Finder" to set desktop picture to POSIX file "'"$desktopPicture"'"'

UI からですと,[システム環境設定] の [デスクトップとスクリーンセーバ] で,[デスクトップ] パネルにあるリストから [Apple > 無地の色 > ソリッドグレイ・プロ・ウルトラダーク] と操作したのに同じ,かと*1

参照先はコチラ.;

The simplest way to do it in one line:

osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Earth Horizon.jpg"'

via. [How do I change desktop background with a terminal command - Ask Different][00]

いつもの通り defaultsplistuddy を道具にさらっと終わるだろうと考えていたら全くそうでなく,想定を遥かに超える労を費やしてしまいました.
更には辿りつく結果というものが,よりによって applescrit に頼らなければならない,と言うことでスッキリせず.と言うか,気分悪い :(

以下,今回の作業で知った事メモ.

デスクトップの設定はこの辺りらしい....んだけど

設定はどこで管理されているかを知るのに,まずは defaults の "read" で設定前後のリダイレクト結果を diff り,それでだめなら opensnoope,と言ったワークフローを採っているのですが,どうもそれでは当たりがつかない.((あとこのあたりの手続き,どうしているかについては,整理の意味をも込めて自分の為にも(笑 追って採りあげてみたいと考えていたりします.))

opensnoop の応え見ると,
/Library/Caches/com.apple.desktop.admin.png やら /System/Library/CoreServices/DefaultDesktop.jpg やら,デスクトップの画像データが置かれている /Library/Desktop Pictures/Solid Colors/png ファイル辺りが何やらうごめいているようですが...

よくわからない.

plist じゃない,と言う事みたい,たぶん

ですので今までみたいな感覚で捉えては駄目みたいです.

今回のデスクトップの画像に関する設定は,これまで出会ってきたような,*.plist に設定値を書き込む,という仕組みでない,と.
だから,上述の defaultopensoop を使ったやり方では引っ掛からない,というわけです.

ではその設定はどこで,どんな仕組みで? となるのですが.
どうやらこう言うことらしいです...

それはどうやら sqlite DB とな

デスクトップ画像の設定は sqlite DB を使ったものらしいのです.
具体的には ~/Library/Application\ Support/Dock/desktoppicture.db とのこと.

そして使う道具は sqlite3 となり,これで上述 db を突っつくことになるらしいです.

sqlite DB を使う,この仕組みになったのは 10.9 Mavericks からのようで,それまでは当初想定していた "いつもの" plist によるものだったらしい.

つか sql って,なつかしい(遠目

と言う事でして...

sqlite3 を使っての方法

実は今回はじめて sqlite3 を使う.

% type sqlite3

確かに居る.知らなかった...

と言う事で,コチラコチラの手続きを参照しながらやってみる.

% sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "update data set value = '/Library/Desktop Pictures/Earth Horizon.jpg'";
% killall Dock;

のですが,自分の環境では上手くいきませんでした.
自身のやり方に何か問題があったのかもしれませんが.

気になったので...;

sqlite って?

見よう見真似で。

% sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .tables
data         displays     pictures     preferences  prefs        spaces
sqlite> PRAGMA table_info('data');
0|value||0||0
sqlite> select * from data;
sqlite> update data set value = "/Library/Desktop Pictures/Earth Horizon.jpg";
sqlite> .quit
  1. data ってテーブルらしいのですが、いる?、と言う事を確かめてみたく。
    居ますね。
    「どんなテーブルがあるか」を知るには、.table だそう
  2. value ってカラムある? ということで。
    「そのテーブルを構成するカラムは」を知りたい時は、PRAGMA table_info('<テーブル名>'); とのこと
    ちなみに、最後のセミコロン ; は必要とのこと。SQL 文の場合は後ろにセミコロンを付けると言う事のようですが、これも...なの?
  3. では更新前の value の値は?。 反応なし。
  4. アップデートかけてみる。 反応なし。

sqlite っては勿論データベース RDBMSなんですが,他の RDBMS との間でどんなキャラかと言うと軽いこと.それは《アプリケーションに組み込んで利用され》るかたちで使われるのだそう.
osx だと《tiger だから 10.4*2 から》導入されるようになったとのこと.

というのを約 10 年間知らずにここまで来ていたのだと...溜息
無知を知るというのは実に悲しい.

というところでおしまい.です.

*1:違っていたらごめんなさい

*2:って 2005 年!!