用于重新启动程序的Bash功能

时间:2015-10-17 16:46:27

标签: linux bash shell command-line

在这个bash函数中,我正在尝试重新启动一个程序:

function restart() {  osascript -e "quit app \"$1\""; sleep 1;  open -a $1 ; }

编辑(更多解释)

osascript -e "quit app \"$1\""执行OSA脚本以向应用程序发送退出信号。睡眠1秒钟以确保应用程序已完成退出。 open -a $1再次打开该应用程序。

该功能只是切换应用程序状态(即,如果打开则关闭应用程序,反之亦然)。这意味着$ 1被替换为我传递给函数的arg,但由于某种原因,一次执行第一个或最后一个命令。如果有人告诉我如何解决它,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的解决方案可以提高速度和可靠性。 在您的情况下,如果应用程序提前终止,您就是在浪费时间。 相反,如果应用程序需要更多时间来终止,那么您的脚本将无法打开新实例。

适用于 OS X 10.11 El Capitan

restart() {
        osascript -l JavaScript <<EOF > /dev/null
var app = Application('$1')

if (app.running()) {
    try { app.quit() } catch (e) {}
}

// Waits at most 4 seconds, checking every 100ms
// if the app has terminated.
for (var i=0; i<40; ++i) {
    delay(0.1)
    if (! app.running()) {
        app.launch()
        break
    }
}
EOF
}

restart "$@"

如果您使用 OSX 10.10 Yosemite ,只需将app.running()替换为running("$1")

ObjC.import('AppKit')   // $.NSWorkspace

function running(app) {
    var apps = ObjC.unwrap($.NSWorkspace.sharedWorkspace.runningApplications)

    for (var i = 0, j = apps.length; i < j; ++i) {
        var id = ObjC.unwrap(apps[i].bundleIdentifier)
        var name = ObjC.unwrap(apps[i].localizedName)
        if ((id && id.toLowerCase() === app) ||
            (name && name.toLowerCase() === app)) {
            return true
        }
    }

    return false
}

答案 1 :(得分:0)

当我将睡眠时间增加到2秒时,该功能按预期工作。

function restart() {  osascript -e "quit app \"$1\""; sleep 2;  open -a $1 ; }