![通过 bash 脚本将应用程序添加到 OSX“登录项”](https://linux22.com/image/557885/%E9%80%9A%E8%BF%87%20bash%20%E8%84%9A%E6%9C%AC%E5%B0%86%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B7%BB%E5%8A%A0%E5%88%B0%20OSX%E2%80%9C%E7%99%BB%E5%BD%95%E9%A1%B9%E2%80%9D.png)
我需要一种方法来从作为安装程序的一部分运行的 postflight 脚本将应用程序添加到登录项。它需要在 10.5+ 上运行。最好是在 bash 脚本中运行。我的应用程序已经需要管理权限。
我在这里找到的方法:https://stackoverflow.com/questions/4912212/mac-os-login-items-with-arguments似乎在正确的轨道上(包括下面)......但是当我在命令行上尝试它时它不起作用,我不确定如何让它为所有用户安装,或者我是否需要添加逻辑来检查它是否已在调用此代码之前添加到启动项中。
#!/bin/bash
/usr/bin/osascript -e "tell application \"System Events\" to make new login item with properties { path: \"$1\", hidden:false } at end"
我怀疑我也可以使用 launchd 来做某事。但是,我不确定哪种方法是跨版本兼容性的最佳实践。
答案1
如果你不介意读一下,我建议你先阅读Apple 技术说明 TN2083:守护进程和代理。
我还没有测试过,但我相信最简单的方法是通过launchd
代理人。这实质上涉及将plist
文件放入/Library/LaunchAgents
。这样做的一个好处是,您可以根据需要多次覆盖同一个文件,并且您不应该获得项目的多个实例(每个用户)。
就像是:
#!/bin/sh
cat > /Library/LaunchAgents/com.serverfault.myapp.plist << EOT
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.serverfault.myapp</string>
<key>ProgramArguments</key>
<array>
<string>/Library/MyApp/myapp.app/Contents/MacOS/myapp</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
EOT
另一种可能性是全局登录项。从上面提到的技术说明中,我了解到:
- A全局登录项是任何用户登录时启动的登录项。
- 在 Mac OS X 10.5 及更高版本中,您可以使用共享文件列表界面向启动服务 [API] 安装全局登录项。
- 在早期系统上,您可以安装登录项[不是A全局登录项] 通过向
System Events
进程发送 Apple 事件。[那么从 10.5 开始,这种方法可能不再可靠吗?] - 在 Mac OS X 10.5 之前,不支持安装全局登录项。[哇!太疯狂了。]
我相信很多应用程序(launchd
10.5 之前的版本)都直接操作该loginwindow.plist
文件。不幸的是,很多应用程序都操作不正确——我无法告诉你loginwindow.plist
我见过多少半 XML 半二进制全损坏的文件。
答案2
裂变是相当准确的。
以下 stackoverflow 帖子中提供了有关从 bash 添加登录项的一些其他详细信息: