如果不结束 shellscript,Applescript 就不会转到下一条指令吗?

如果不结束 shellscript,Applescript 就不会转到下一条指令吗?

我是 Applescript 和编程的新用户。

我正在尝试创建一个脚本,该脚本将 1) 通过终端加载 Renpy 项目;2) 然后使用应用程序 Display Maid 中的按键命令将生成的项目窗口移动到不同的显示器。

我可以获得两个可以自行成功运行的不同脚本:

do shell script "/Applications/renpy-7.3.5-sdk/renpy.sh /Users/username/Documents/Renpy\\ projects/projectname"

tell application "Display Maid"
    activate
    tell application "System Events" to keystroke "r" using {control down, command down}

end tell

但是,当我将它们放在一个脚本中时,它永远不会进入第二步。Applescript 似乎想要等到 shell 脚本完全完成后再进入 Display Maid 部分。

我该如何让它工作?我还通过“系统偏好设置”为生成的应用程序授予了可访问性权限,但这并没有改变任何东西。

答案1

do shell script "/Applications/renpy-7.3.5-sdk/renpy.sh ~/Documents/Renpy\\ projects/projectname 2>/dev/null 1>&2 &"

tell application "System Events"
    set _P to a reference to process "renpy"
    set _W to a reference to window 1 of _P

    repeat 20 times -- 10 seconds max. wait
        if _W exists then exit repeat
        delay 0.5
    end repeat

    if not (_W exists) then return
    set _P's frontmost to true

    -- Display Maid's global hotkey to restore window layout
    keystroke "r" using {control down, command down}
end tell

答案2

根据 做 shell 脚本圣经,AppleScript 等待 shell 命令退出后才继续。

您可以通过告诉 shell 命令在后台运行并通过以下任一方式抑制命令的 stdout 和 stderr 来绕过这个问题:

do shell script "command > /dev/null 2> file_path &"

do shell script "command > /dev/null 2>&1 &"

抑制> /dev/nullstdout;2>&1抑制 stderr(具体来说,将 stderr 发送到与 stdout 相同的位置),尾随& 将命令置于后台。

使用此功能将立即将控制权返回给您的 AppleScript 且没有任何结果,而 AppleScript 脚本与后台的 shell 脚本并行运行。

AppleScript 不直接支持获取或操作后台进程,但请参阅此 技术说明

这会使脚本变成:

do shell script "/Applications/renpy-7.3.5-sdk/renpy.sh /Users/username/Documents/Renpy\\ projects/projectname > /dev/null 2>&1 &

tell application "Display Maid"
    activate
    tell application "System Events" to keystroke "r" using {control down, command down}
end tell

相关内容