JXA의 "Error : A privilege violation occurred"회피

10096 단어 AppleScriptjXAMac
JXA로 어플리케이션을 지정해 Standard Additions 의 메소드를 사용하려고 하면(자) 빈번하게 이하의 에러가 나온다.
var finder = Application("Finder");

finder.includeStandardAdditions = true;
finder.doShellScript("date");
//!! Error on line 1: Error: A privilege violation occurred.

이 경우 currentApplication 를 사용하면 아마 대부분 갈 수 있다.
var app = Application.currentApplication();

app.includeStandardAdditions = true;
app.doShellScript("date");
//=> "2015年 2月25日 水曜日 17時16分28秒 JST"
currentApplication 는 스크립트를 실행하는 응용 프로그램을 검색하는 메서드입니다.

Script Editor에서 실행하고 있으면 Script Editor.
Terminal에서 실행 중이면 Terminal...이 아니라 osascript 명령.
Terminal이 직접 실행하는 것은 아니기 때문에.

그 밖에도 예를 들면
CotEditor은 사용자가 만든 스크립트를 사용할 수 있습니다.
거기서 실행했을 경우의 currentApplication 는 Cot Editor.

osascript를 볼 때 warning



warning: failed to get scripting definition from/usr/bin/osascript; it may not be scriptable.

라고 매회 나오지만 「osascript에는 .sdef 파일이 없기 때문에, 스크립트로 조작할 수 없다고 생각해」라고만.
osascript 자체가 아니라 Standard Additions 의 메소드를 사용하는 것만이니까 문제 없음. 해야합니다.

osascript 참조에서 이름을 얻으려고 .name() 라고 하면 오류가 나오므로 주의.
라고 할까 이것 불안해질 뿐이니까 표시하지 않으면 좋겠다. 아니 역시 필요?

스크립트 메뉴에서 실행할 때 currentApplication



Script Editor 같은 알기 쉬운 것이라면 좋지만, 스크립트 메뉴에서 실행한 경우는 무엇이 불리는 것인가.currentApplication 는 많이 사용하기 때문에, 득체의 모르는 채로 사용하면 모야모야 한다.

AppleScript와 달리, 명시적으로 Standard Additions 를 유효하게 하지 않으면 안 되고 신경이 쓰였으므로 조사했다.

스크립트 메뉴 정보



스크립트 편집기 설정에서 스크립트 메뉴를 활성화하면 메뉴에 아이콘이 추가됩니다.
스크립트를 ~/Library/Scripts/에 넣으면 해당 메뉴에 표시됩니다.
컴파일된 스크립트( .scpt )로 하면 언제 어디서나 한 번의 클릭으로 실행할 수 있다.



덧붙여서 Script Editor를 경유하지 않아도 설정 변경 가능.
var app = Application("AppleScript Utility");

// 確認
app.scriptMenuEnabled();
//=> true / false

// 有効にする
app.scriptMenuEnabled = true;

스크립트 메뉴의 "currentApplication"



이것을 조사하는 스크립트를 JXA로 쓰면 어렵다.
라고 할까 결국, 몰랐다.

AppleScript라면 간단했다.

where_is_current_app.scpt
display dialog (path to current application)'s POSIX path

스크립트 편집기에서 실행하는 경우.

/Applications/Utilities/Script Editor.app/
스크립트 메뉴에서 실행하는 경우.

/usr/bin/osascript
일반적으로 osascript 이었다.

뱀발



예상에서는 전용의 어플리케이션이 있는지, 최전면의 어플이 사용되는지, Finder인가라고 생각하고 있었다.

옛날은 이것이었던 것 같다. 지금은 존재하지 않는다. (참고: MacWiki )/System/Library/CoreServices/AppleScript Runner.app

스크립트 메뉴에서 오류가 발생하면



아무 일도 일어나지 않는다. 아무것도 통지되지 않습니다.
도중에 단순히 실행이 정지되므로 주의.
제대로 try...catch 하면 괜찮아.

콘솔 .app에 오류 팁이 남아있을 수 있습니다.



뱀발 2



위에 썼지만 currentApplication의 이름은 AppleScript에서 한 줄로 얻을 수 있었다.
JXA에서 어떻게든 시도하고 있었지만 (할 수 없었던) 코드를 여기에서 공양한다.
var app = Application.currentApplication();
app.includeStandardAdditions = true;

var str = Automation.getDisplayString(app);

// これじゃたぶん意味ない。(osascriptで実行してるじゃん)
//msg = app.doShellScript('osascript -l JavaScript -e "Application.currentApplication()" 2>&1 1> /dev/null | cat');
//str += "\n" + msg;

try { // try..catchしとかないとエラー出たら無言でアプレット消える
  str += "\n\nproperties: " + Automation.getDisplayString(Object.getOwnPropertyNames(app));

  str += "\nname: " + app.name(); //osascriptから.name()とか呼んだらエラー出る
  str += "\n\n" + JSON.stringify(app.properties(), null, "  ");

} catch(e){
  str += "\n\n" + e.toString();
}

app.displayDialog(str);

스크립트 편집기에서 실행할 때 대화 상자.
Application.currentApplication()

properties: ["__private__"]
name: Script Editor

{
  "frontmost": true,
  "class": "application",
  "name": "Script Editor",
  "version": "2.7"
}

스크립트 메뉴에서 실행할 때 대화 상자.
Application.currentApplication()

properties: ["__private__"]

Error: Message not understood.

JXA의 Standard Addisions에도 pathTo는 있다.
그러나 current application를 문자열로 전달하거나 currentApplication을 그대로 전달해도 경로를 얻을 수 없습니다.
JXA로 패스를 얻는 방법이 있다면 아는 분은 가르쳐 주세요.

참고


  • AppleScript 파일 참조와 관련된 메모 - 왕새우가 보았습니다 ....
  • 표준 에러 출력을 파이프에 흘려 보내는 방법 | CentOS·Red Hat Linux 실천 테크닉 - 샘플 코드에 의한 Perl 입문
  • 좋은 웹페이지 즐겨찾기