1

JavaScript for Automation (JXA) でサブプロセスを開始し、改行、シェル メタなどを含む可能性のある文字列をそのサブプロセスの stdin に送信したいと考えています。これに対する以前の AppleScript アプローチでは、bash の<<<演算子、文字列連結、および文字列を使用しquoted form ofていました。quoted form ofエッジ ケースをすべて取得できると信頼できる同等の JavaScript があれば、同じアプローチを使用できます。そのために正規表現の方法を調査しています。

しかし、JXA からアクセスできるので、 、、および を直接 unistd.h呼び出してみませんか?パラメータとして2つの整数の配列を取る必要があるように見えますが、私が試したことはどれもうまくいきませんでした:$.pipe$.fork$.execlp$.pipe

ObjC.import('unistd')
$.pipe() // Error: incorrect number of arguments
$.pipe([]) // segfault
$.pipe([3,4]) // segfault
$.pipe([$(), $()]) // segfault
var a = $(), b=$()
$.pipe([a,b]) // segfault
$.pipe($([a,b])) // NSException without a terribly helpful backtrace
$.pipe($([$(3), $(4)])) // segfault
var ref = Ref('int[2]')
$.pipe(ref)
ref[0] // 4, which is close!

助言がありますか?

4

3 に答える 3

2

stdioの代わりにCocoaを使用して、機能するアプローチを見つけました:

ObjC.import('Cocoa')
var stdin = $.NSPipe.pipe
var stdout = $.NSPipe.pipe
var task = $.NSTask.alloc.init
task.launchPath = "/bin/cat"
task.standardInput = stdin
task.standardOutput = stdout

task.launch
var dataIn = $("foo$HOME'|\"").dataUsingEncoding($.NSUTF8StringEncoding)
stdin.fileHandleForWriting.writeData(dataIn)
stdin.fileHandleForWriting.closeFile
var dataOut = stdout.fileHandleForReading.readDataToEndOfFile
var stringOut = $.NSString.alloc.initWithDataEncoding(dataOut, $.NSUTF8StringEncoding).js
console.log(stringOut)
于 2014-12-22T03:16:15.807 に答える
1

quoted form ofスクリプト リテラルをシェル コマンドに安全に渡すための AppleScript に相当する JXA がないように見えることは、実に興味深いことです。

ただし、実装はかなり簡単です。

// JXA implementation of AppleScript's `quoted form of`
function quotedForm(s) { return "'" + s.replace(/'/g, "'\\''") + "'" }

// Example
app = Application.currentApplication();
app.includeStandardAdditions = true;

console.log(app.doShellScript('cat <<<' + quotedForm("foo$HOME'|\"")))

クレジットはquotedForm()このコメントに送られます。

私が知る限り、この実装はquoted form of次の場合と同じです。

  • 最も単純な形式では、文字列に単一引用符が埋め込まれていない場合は、文字列全体を単一引用符で囲みます。POSIX ライクなシェルは、単一引用符で囲まれた文字列に対して補間をまったく実行しないため、そのまま保持されます。

  • 文字列に埋め込まれた単一引用符が含まれている場合、複数単一引用符で囲まれた文字列に効果的に分割され、埋め込まれた各単一引用符が\'(バックスラッシュでエスケープされた) として結合されます。単一引用符を埋め込むことはできないため、これが必要です。 POSIX 互換シェルの単一引用符付きリテラル。

POSIX 互換シェルでは、これはすべての文字列に対して機能するはずです。

于 2015-10-10T06:14:30.910 に答える