Geben Sie JXA nach stdout aus

Ich habe ein kleines Skript mit JXA (JavaScript for Automation) erstellt, das ein Ergebnis mit console.log.

Scheint jedoch console.logauf stderr auszugeben und ich möchte auf stdout ausgeben. Ich kann immer 2>&1beim Aufruf des Skripts, aber es wäre vorzuziehen, direkt aus dem Skript auf stdout auszugeben.

Gibt es eine Möglichkeit, das zu erreichen?

Enge Wähler: Diese Frage zum Thema, da Skripterstellung auf dieser Site ausdrücklich als zum Thema gehörend aufgeführt ist.
Wie schreiben Sie in console.log? Sicherlich schreiben Sie in stdout oder stderr
@Mark Just console.log('whatever'). Nichts Außergewöhnliches.
Wgat sagt die Dokumentation für console.log?
@Mark Ich habe nie eine offizielle gute Dokumentation zu JXA gefunden. Das kann man aber nicht wirklich ableiten. Ich habe kein Problem beim Erstellen von Skripten, ich frage nach der spezifischen Funktion (oder Option), die das tut, was ich brauche.

Antworten (2)

Lösung gefunden: nicht verwenden console.logoder irgendetwas anderes. Anstatt

console.log('something');

Einfach

'something';

Es wird auf stdout ausgegeben.

Gibt nur die letzte Anweisung zurück
@basil Wie zu erwarten wäre.
Aber welche Zeichenkodierung wird verwendet?

Es ist vielleicht nicht die schönste Lösung aller Zeiten, aber ich denke, Ihre beste Wahl ist die Verwendung der Objective-C-Skriptbrücke. Die Alternative wäre, sich direkt mit der Befehlszeile und zu befassen printf, was wahrscheinlich noch unordentlicher wäre.

Mithilfe der Skriptbrücke können Sie console.logeine benutzerdefinierte Funktion neu zuweisen, die stdoutmithilfe von NSFileHandle.fileHandleWithStandardOutput. Wenn Sie diese Definition an den Anfang Ihres Programms stellen, können Sie diese überarbeitete console.log.

console.log = function() {
    ObjC.import('Foundation');
    for (argument of arguments) {
        $.NSFileHandle.fileHandleWithStandardOutput.writeData($.NSString.alloc.initWithString(String(argument) + "\n").dataUsingEncoding($.NSNEXTSTEPStringEncoding));
    }
}

Beachten Sie, dass ich am Ende jeder Zeichenfolge einen Zeilenumbruch hinzugefügt habe. Möglicherweise möchten Sie dieses Verhalten an Ihre Anforderungen anpassen.

Gitter! Einige Daten sollten jedoch vor der Ausgabe entpackt werden:console.log(ObjC.unwrap(app.bundleIdentifier))