Вызов сценария оболочки с помощью JavaScript для автоматизации
Используя AppleScript, я могу вызвать скрипт оболочки с:
do shell script "echo 'Foo & Bar'"
Но я не могу найти способ сделать это с помощью JavaScript в Yosemite Script Editor.
2 ответа
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)