JXA の基本
# 最終更新日 2020.06.14
JXA 公式サイト
OS X 10.10 Release Notes
JXA 公式サイト
OS X 10.10 Release Notes
JXA をターミナルで実行
# Apple Script と JXA は同じ osascript コマンドを使用します # JXA を使うには -l オプションを使います # 対話形式で JXA を使うには -i オプションを使います # ~/.zshrc に jxa 等の名前でエイリアスを作っておくと便利 # console.log の戻り値 undefined も表示されることに注意 # 対話を終了するには control+D を押します osascript -l JavaScript -i >> console.log('ほげ'); ほげ => undefined >> # -e オプションで直接 Terminal.app に直接コードが書けます # -i の対話形式以外では戻り値は表示されません # 使う人は滅多にいないと思うけど osascript -l JavaScript -e "console.log('ひげ');" # オプション無しなら stdin を実行する # 使う人は絶対にいないと思うけど echo "console.log('はげ');" | osascript -l JavaScript # 引数に JXA で書かれたファイルを指定すれば実行される # 拡張子無しにする場合は -l オプション必須です # js という拡張子があれば -l オプションは不要 osascript src.js
JXA をファイルから実行
#!/usr/bin/osascript /** * 上記のようにファイル名を指定すれば実行できます * 更に一行目にシバンを書けば実行パーミッションだけで実行できます * Atom で atom-runner を使えばシバンのとおりに実行されるので便利 */ console.log('ファイルから実行');
Objective-C Bridge
#!/usr/bin/osascript ObjC.import('Cocoa'); /** * 公式等でみかける上記により Foundation, AppKit の関数が使えます * Foundation, AppKit はもちろん個別で指定してもいい * 他にも stdio, unistd 等が使えますのでこの Tips で例を書いています * 他にも沢山あるので公式の Objective-C Bridge 以下をご覧ください */ $.NSLog("%@", $('日本語'));
StandardAdditions
#!/usr/bin/osascript /* * AppleScript は直接 do shell script みたいに書ける * JXA で StandardAdditions を使うには下記のようにする * StandardAdditions については ScriptEditor.app で * command+shift+L から参照してください */ let app = Application.currentApplication(); app.includeStandardAdditions = true; app.doShellScript('ls', {alteringLineEndings: false}); app.displayAlert('日本語も問題無し');
stdin, stdout
#!/usr/bin/osascript /* * stdout は console.log() でいいです * ただし最後に必ず改行が入るのでまとめて出力するなどする * stdin は readline が普通に使えます */ ObjC.import('readline'); let s = $.readline('>> '); console.log(`入力されたのは ${s} です`);
ファイルの読み書き
#!/usr/bin/osascript /* * UTF-8 になる前の各国毎 Locale かつ改行は CR になるコード * 具体的には日本語環境では MacJapanese になる * https://ja.wikipedia.org/wiki/MacJapanese */ let app = Application.currentApplication(); app.includeStandardAdditions = true; const lines = `読み書きはできるけど MacJapanese になる例 AppleScript の «class utf8» を使う裏技は JXA では使えない http://piyocast.com/as/archives/432 そもそもこの手段も Apple 公式では公開されていないマジ裏技 素直に NSString や下記の cat を使いましょう`; let path = Path('/Users/sasakima-nao/_output.txt'); let w = app.openForAccess(path, { writePermission: true }); try { app.write(lines, {to: w, as: 'text'}); } finally { app.closeAccess(w); } let r = app.openForAccess(path); try { let s = app.read(r); console.log(s); } finally { app.closeAccess(r); }
シェルスクリプトの実行
#!/usr/bin/osascript /* * 下記のようにすると出力が戻る、パイプも当然のように使える * この cat の出力は UTF-8 のまま戻ってくるので上記の心配は無い * ただし alteringLineEndings を指定しないと戻り値の改行が CR に変換される * それで問題ない場合以外は必ず指定するように */ let app = Application.currentApplication(); app.includeStandardAdditions = true; let s = app.doShellScript('cat aaa.js | grep let', {alteringLineEndings: false}); let lines = s.split('\n'); let num = 0; for (line of lines) { num++; let head = num.toString().padStart(4, '0'); console.log(`${head} ${line}`); }
Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.