LoginSignup
2
3

More than 5 years have passed since last update.

NSUserScriptTask経由のJXAはdoShellScriptを実行できない

Last updated at Posted at 2016-12-15

概要

サンドボックス下のアプリからNSUserScriptTaskを用いてスクリプトを実行するとき、記述言語がJXAである場合に限り、doShellScriptrunScriptといった、外部プロセスを起動する命令を実行するとエラーが発生する。

CotEditorのユーザースクリプトなどがこのような環境に該当する。

コード

ViewController.swift
import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let scriptsPath = try! FileManager.default.url(for: .applicationScriptsDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

        let jxaTask = try! NSUserAppleScriptTask(url: scriptsPath.appendingPathComponent("doshellscript_jxa.scpt"))

        jxaTask.execute(withAppleEvent: nil) { (result, error) in
            print(error!.localizedDescription)
        }
    }  
}
doshellscript.scpt
var app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript('ls')

結果

execution error: Error on line 3: Error: A privilege violation occurred. (-10004)

ワークアラウンド

外部プロセス呼び出しをAppleScriptで記述し、Library関数で呼び出す。

main.scpt
var ExternalProcess = Library('ExternalProcess')
ExternalProcess.doShellScript('ls')
ExternalProcess.scpt
on doShellScript(theCommand)
    do shell script theCommand
end doShellScript
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3