使用 AppleScript,我可以调用 shell 脚本:
do shell script "echo 'Foo & Bar'"
但我找不到在优胜美地脚本编辑器中使用 JavaScript 执行此操作的方法。
使用 AppleScript,我可以调用 shell 脚本:
do shell script "echo 'Foo & Bar'"
但我找不到在优胜美地脚本编辑器中使用 JavaScript 执行此操作的方法。
do shell script
是标准脚本添加的一部分,所以这样的东西应该可以工作:
app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript("echo 'Foo & Bar'")
为了补充 ShooTerKo 的有用答案:
调用 shell 时,正确引用命令中嵌入的参数很重要:
为此,AppleScript 提供quoted form of
了在 shell 命令中安全地使用变量值作为参数,而不必担心 shell 更改值或完全破坏命令。
奇怪的是,从 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, "'\\''") + "'" }
据我所知,这正是 AppleScriptquoted form of
所做的。
它将参数括在单引号中,以保护它免受 shell 扩展;由于单引号 shell 字符串不支持转义嵌入的单引号,因此带有单引号的输入字符串被分解为多个单引号子字符串,其中嵌入的单引号拼接在 via\'
中,然后 shell 将其重新组装成单个字面量。
例子:
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建议执行以下操作(稍微编辑):
如果你有一个在 JS 中引用的 AppleScript 库
var lib = Library("lib")
,你可能希望添加on quotedFormOf(s) return quoted form of s end quotedFormOf
到这个图书馆。
这将使引用形式的 AppleScript 实现随处可用,如lib.quotedFormOf(s)