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 --- 2025.