在这个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,但由于某种原因,一次执行第一个或最后一个命令。如果有人告诉我如何解决它,我将不胜感激。
答案 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 ; }