Используя AppleScript, я могу вызвать сценарий оболочки с помощью:
do shell script "echo 'Foo & Bar'"
Но я не могу найти способ сделать это с помощью JavaScript в редакторе сценариев Yosemite.
Используя AppleScript, я могу вызвать сценарий оболочки с помощью:
do shell script "echo 'Foo & Bar'"
Но я не могу найти способ сделать это с помощью JavaScript в редакторе сценариев Yosemite.
do shell script
является частью стандартных дополнений к сценариям, поэтому должно работать что-то вроде этого:
app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript("echo 'Foo & Bar'")
Чтобы дополнить полезный ответ ShooTerKo:
При вызове оболочки важно правильно заключать в кавычки аргументы, встроенные в команду:
С этой целью AppleScript предоставляет quoted form of
для безопасного использования значений переменных в качестве аргументов в команде оболочки, не опасаясь изменения значений оболочкой или полного нарушения команды.
Любопытно, что в OSX 10.11 похоже, что JXA-эквивалента quoted form of
не существует, но его легко реализовать самостоятельно (заслуга принадлежит этот комментарий к другому ответу и calum_b позже исправление):
// This is the JS equivalent of AppleScript's `quoted form of`
function quotedForm(s) { return "'" + s.replace(/'/g, "'\\''") + "'" }
Насколько я могу судить, это делает именно то, что делает AppleScript quoted form of
.
Аргумент заключен в одинарные кавычки, что защищает его от расширения оболочки; поскольку строки оболочки в одинарных кавычках не поддерживают экранирование встроенных одинарных кавычек, входная строка с одинарными кавычками разбивается на несколько подстрок в одинарных кавычках, а встроенные одинарные кавычки соединяются через \'
, который оболочка затем собирает в один литерал.
Пример:
var app = Application.currentApplication(); app.includeStandardAdditions = true
function quotedForm(s) { return "'" + s.replace(/'/g, "'\\''") + "'" }
// Construct value with spaces, a single quote, and other shell metacharacters
// (those that must be quoted to be taken literally).
var arg = "I'm a value that needs quoting - |&;()<>"
// This should echo arg unmodified, thanks to quotedForm();
// It is the equivalent of AppleScript `do shell script "echo " & quoted form of arg`:
console.log(app.doShellScript("echo " + quotedForm(arg)))
В качестве альтернативы, если ваш сценарий JXA все равно загружает пользовательскую библиотеку AppleScript, BallpointBen предлагает выполнить далее (слегка отредактировано):
Если у вас есть библиотека AppleScript, на которую вы ссылаетесь в JS, используя
var lib = Library("lib")
, вы можете добавитьon quotedFormOf(s) return quoted form of s end quotedFormOf
в эту библиотеку.
Это сделает реализацию AppleScript в кавычках доступной везде, какlib.quotedFormOf(s)
NSTask
, так как он намного надежнее и эффективнее, чемdo shell script
. - person foo   schedule 21.01.2015