L'Isola di Niente
L'Isola di Niente » JavaScript Tips » Gjs, jjs, JXA

Gjs, jjs, JXA

# 最終更新日 2017.02.26

スタンドアロン(単独で利用できる)の JavaScript 実行環境。
Gjs (GNOME), jjs (JVM), JXA (macOS) の覚書。

標準入出力
//
// Gjs
//
#!/usr/bin/gjs

const Gio  = imports.gi.Gio;

let uostream = new Gio.UnixOutputStream({fd: 0});
let dostream = new Gio.DataOutputStream({base_stream: uostream});
dostream.put_string("何か入力して Enter :", null);

let uistream = new Gio.UnixInputStream({fd: 1});
let distream = new Gio.DataInputStream({base_stream: uistream});
let [txt, len] = distream.read_line_utf8(null);
print(txt + " が入力されました");

//
// jjs (readLine は -scripting option 必須)
//
#!/usr/bin/env jjs -scripting
 
var jjs_str = readLine("何か入力して Enter :");
print(jjs_str + " が入力されました");

//
// JXA
//
#!/usr/bin/osascript

ObjC.import('Cocoa')

// prompt
let fho = $.NSFileHandle.fileHandleWithStandardOutput;
let prp = $("何か入力して Enter :").dataUsingEncoding($.NSUTF8StringEncoding)
fho.writeData(prp);

let fhi = $.NSFileHandle.fileHandleWithStandardInput;
let data = fhi.availableData;
let nsStr = $.NSString.alloc.initWithDataEncoding(data, $.NSUTF8StringEncoding);
console.log(nsStr.js.trim() + " が入力されました")

ファイルの読み書き
//
// Gjs
//
#!/usr/bin/gjs

const GLib  = imports.gi.GLib;

const TEXT = "書き込み及び読み込みができない場合は例外が発生します";
const FILE = "gjs_write.txt";

let result = GLib.file_set_contents(FILE, TEXT); // Write
if (result) {
    print("Write Success");
}
let [result, contents] = GLib.file_get_contents(FILE); // Read
if (result) {
    print(contents.toString());
}

//
// jjs (readFully は -scripting option 必須)
//
#!/usr/bin/env jjs -scripting

var FileWriter  = Java.type("java.io.FileWriter");

var FILENAME = "jjs_write.txt";

var fw = new FileWriter(FILENAME); // Write
fw.write("jjs で書き込み");
fw.close();

var s = readFully(FILENAME); // Read
print(s);

//
// JXA
//
#!/usr/bin/osascript

ObjC.import("Cocoa");

let nil = $();
let newFile = $("新規テキストファイル.txt");
let text = $("UTF-8 で書き出します\n\tエスケープシーケンスも使えます");

// Write
let res = text.writeToFileAtomicallyEncodingError(newFile, true, $.NSUTF8StringEncoding, nil);
if (res) {
    console.log("Write Success!");
}

// Read
let s = $.NSString.alloc.initWithContentsOfFileEncodingError(newFile, $.NSUTF8StringEncoding, nil);
console.log(s.js);

起動パラメータ
//
// Gjs
//
#!/usr/bin/gjs

let argv = ARGV

if (argv.length == 0) {
    print("No argv");
} else {
    argv.forEach(function(element) {
        print(element);
    });
}

//
// jjs
//
#!/usr/bin/env jjs

var argv = $ARG;

if (argv.length == 0) {
    print("No argv");
} else {
    argv.forEach(function(element) {
        print(element);
    });
}

//
// JXA
//
#!/usr/bin/osascript

function run(argv) {
    if (argv.length == 0) {
        console.log("No argv");
    } else {
        argv.forEach(function(element) {
            console.log(element);
        });
    }
}

環境変数
//
// Gjs
//
#!/usr/bin/gjs

const GLib = imports.gi.GLib;
print(GLib.getenv("HOME"));

//
// jjs
//
#!/usr/bin/env jjs

var System  = Java.type("java.lang.System")
print(System.getenv("LANG"));

//
// JXA
//
#!/usr/bin/osascript

ObjC.import("stdlib");
console.log($.getenv("USER"));

シェルコマンドの実行
//
// Gjs
//
#!/usr/bin/gjs

const GLib = imports.gi.GLib;

[result, output, error, status] = GLib.spawn_command_line_sync("ls -l")
print(output);

//
// jjs($OUT に標準出力が入る)
//
#!/usr/bin/env jjs

$EXEC("pwd");
print($OUT);

//
// JXA
//
#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;
let res = app.doShellScript("echo $LANG");
console.log("$LANG は " + res + " です");
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.