osascript如何传入变量

Chr*_* G. 1 bash applescript

我有以下内容,不起作用。它在终端中打开一个新选项卡,但变量 $DomainName 未传入?

DomainName="example.com"
osascript -e 'tell application "Terminal" to do script "watch dig +short NS $DomainName"'
Run Code Online (Sandbox Code Playgroud)

结果是:

watch dig +short NS $DomainName
Run Code Online (Sandbox Code Playgroud)

如何传入变量?

小智 8

OP\xe2\x80\x99s 问题是关于如何在调用osascript.

\n

这是非常不安全的:

\n
foo="DO NOT DO THIS; say bad script"\nosascript -e "tell application \\"Terminal\\" to do script \\"echo $foo\\""\n
Run Code Online (Sandbox Code Playgroud)\n

(运行该示例以了解我的意思,然后考虑不太友好的字符串可能会造成什么后果。)

\n

对变量进行双引号,$foo以便"$foo"通过顶级 shell 脚本安全地获取它。它不能通过AppleScript安全地获取它:

\n
foo="say \\"bad script\\""\nosascript -e "tell application \\"Terminal\\" to do script \\"echo $foo\\""\n
Run Code Online (Sandbox Code Playgroud)\n

如果运行该示例,它将失败并出现 AppleScript 编译错误:标识符可以\xe2\x80\x99t 位于此\xe2\x80\x9c"\xe2\x80\x9d 之后。(-2740)

\n

That\xe2\x80\x99s 因为osascript接收字符串:

\n
tell application "Terminal" to do script "echo say "bad script""\n
Run Code Online (Sandbox Code Playgroud)\n

这是无效的语法。(尝试在脚本编辑器中编译该行以查看。)

\n

传递 AppleScript 参数的正确方法是将它们附加到osascript\xe2\x80\x99s 参数列表:

\n
osascript -ss -e "\xe2\x80\xa6" - "arg1" "arg2" "arg3"\n
Run Code Online (Sandbox Code Playgroud)\n

需要使用分隔符-将 command\xe2\x80\x99s 自己的选项列表与要转发到 AppleScript\xe2\x80\x99srun处理程序的剩余参数分开。

\n

osascript顺便说一句,通过\xe2\x80\x99s stdin 而不是选项传递 AppleScript 也是一个好主意-e,因为这可以让你编写正常的 AppleScript 代码而不必转义它:

\n
osascript -ss - "arg1" "arg2" "arg3" <<EOF\n\n    on run argv -- argv is a list of 3 strings\n        argv -- do stuff with argv here\n    end run\n\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n

(您可以安全地运行该示例:它只是将 的值写入argv标准输出。)

\n

好的,这样 \xe2\x80\x99 就可以安全地将参数传递到 AppleScript 中了。

\n

..

\n

然而,OP\xe2\x80\x99s AppleScript 创建了一个新的 shell 脚本以在 Terminal.app 中运行。因此,清理用于构造该 shell 脚本的 AppleScript 字符串quoted form of STRING很重要,这是使用 AppleScript\xe2\x80\x99s属性完成的。

\n

因此,这是通过所有三个级别的代码生成来清理任意字符串的正确安全方法:

\n
bar='$test" \\t#est*;say bad script' # a proper nasty test string\n\nosascript -  "$bar"  <<EOF\n\n    on run argv -- argv is a list of strings\n        tell application "Terminal"\n            do script ("echo " & quoted form of item 1 of argv)\n        end tell\n    end run\n\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n

运行该示例,此处使用的相当可怕的测试字符串 I\xe2\x80\x99ve 一直安全地传递到echo.

\n

是的,所有这些字符串清理/代码生成的东西都是令人头痛的,但是 \xe2\x80\x99 是你使用由疯狂的人设计的这么多语言所得到的结果。

\n