为什么 AppleScript 中的“Terminal”被“Applet”取代?

为什么 AppleScript 中的“Terminal”被“Applet”取代?

我有一个简单的 AppleScript(打包为应用程序),它告诉终端执行几行代码。每隔一段时间(大约每 7 到 10 天一次),在冷重启后,代码就会以某种方式“损坏”,Tell 语句中的“Terminal”一词已更改为“Applet”,而“do script”命令已替换为“«event coredosc»”。我只需单击错误提示上的编辑并粘贴应用程序的正确代码即可修复此问题。有人遇到过这种情况吗?我的其他 AppleScript(也打包为应用程序)都没有这个问题,它们告诉终端执行操作。有人知道如何解决这个问题吗?我还尝试在新的 AppleScript 应用程序中从头开始重新输入应用程序的源代码,但没有成功。

我使用的是 OS X 10.8.4。以下是脚本:

set myProcessInfo to do shell script ("ps -x")

if myProcessInfo contains "httpd" and myProcessInfo contains "mysql" then
    do shell script "/Applications/MAMP/bin/stopApache.sh"
    do shell script "/Applications/MAMP/bin/stopMysql.sh"
else
    tell application "Terminal"
            do script "/Applications/MAMP/bin/startApache.sh"
            do script "/Applications/MAMP/bin/startMysql.sh > /dev/null"
    end tell
    delay 10
    do shell script "killall Terminal"
end if

答案1

我不确定你会如何修复弄乱脚本的问题,但是你可以使用 shell 脚本来解决这个问题:

#!/bin/sh

tempfile=$(mktemp /tmp/XXXXXXXXXX)
ps -x >$tempfile

if grep httpd $tempfile && grep mysql $tempfile
then
    /Applications/MAMP/bin/stopApache.sh
    /Applications/MAMP/bin/stopMysql.sh
else
    /Applications/MAMP/bin/startApache.sh
    /Applications/MAMP/bin/startMysql.sh >/dev/null
fi

rm -f $tempfile

正如我在评论中提到的,如果您有 Apache 和 MySQL 的脚本,如果相应的守护进程正在运行,则成功退出,否则不成功,那么您可以使用这些脚本,而不是将输出写入ps临时文件并grepping 它。

或者,您可以使用原始 AppleScript 的修改版本,仅使用do shell script而不是tell application "Terminal" to do script

set myProcessInfo to do shell script ("ps -x")

if myProcessInfo contains "httpd" and myProcessInfo contains "mysql" then
    do shell script "/Applications/MAMP/bin/stopApache.sh"
    do shell script "/Applications/MAMP/bin/stopMysql.sh"
else
    do shell script "/Applications/MAMP/bin/startApache.sh"
    do shell script "/Applications/MAMP/bin/startMysql.sh > /dev/null"
end if

相关内容