Mac JavaScript getenv

Linux 屋が Mac を使うと環境変数が少ないなぁと感じる。

env

そのせいか osascript で環境変数を得る方法がなかなか見つからなかった。
いくら検索してもパスを通すことばかり、Windows と変わらないじゃん。
三時間くらい探し続けてやっと見つけた。

CotEditor :: ひまつぶし雑記帖

鳶嶋工房 / AppleScript / JavaScript for Automation (JXA)

osascript って stdlib のインクルードも可能なのか。
なら stdio もイケるかも、よしやってみよう。

#!/usr/bin/osascript

ObjC.import("stdlib");
ObjC.import("stdio");

var user = $.getenv("USER");
//console.log("ユーザー名は " + user + " です");
// 戻り値が出力されるので変数に入れている
// printf って転送バイト数が戻るとは知らなかった...
// 自動改行されるので \n を省いています
var dev_null = $.printf("ユーザー名は %s です", user);

/* //ShellScript から得るという手段もある
app = Application.currentApplication();
app.includeStandardAdditions = true;
var path = app.doShellScript("echo $LANG");
console.log("$LANG は " + path + " です");
*/

getenv

なんだよ、glibc の関数が普通に使えるじゃないか。
しかし今まで何気に使っていた printf にこんな罠が。

ただ printf と console.log は混在させないほうがいい。
上記下側のコメントアウトを外してみよう。

output_pointer

出力が上下で入れ替わってしまった、ように見えますが。
単に printf と console.log で出力ポインタ管理が違う。
つまり console.log の出力は行先頭のままになる。
結果、最初の出力が console.log の出力に押し出されてこうなる。

#!/usr/bin/osascript

ObjC.import("string");

var nae = "優木苗";
console.log(nae.length); //=>3
console.log($.strlen(nae)); //=>9

おぉ日本語のバイト数も C 標準関数を使えば得られる。
Gjs で GLib 関数がフルに使えるのとほぼ同じことができるのね。
Mac で JavaScript も想像していたより便利そうです。