如何避免在我的 launchd plist 中使用 bash 脚本?

How can I avoid using a bash script in my launchd plist?

这是我启动的 plist

<?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>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>com.localhost.hexo</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/frankg/dev/bin/start-hexo.sh</string>
  </array>
  <key>UserName</key>
  <string>frankg</string>
  <key>RunAtLoad</key>
  <true/>
  <key>StandardErrorPath</key>
  <string>/Users/frankg/hexo</string>
  <key>StandardOutPath</key>
  <string>/Users/frankg/hexo</string>
</dict>
</plist>

这是我的bash脚本

hexo server --cwd /Users/frankg/dev/code/apps/blog  >> /tmp/MyLaunchdTest.out

这是有效的。如何避免使用 bash 脚本。

指定 hexo 可执行文件的完整路径,后跟每个参数作为 ProgramArguments 数组中的单独字符串。我对各种输出重定向感到有点困惑——在当前的 .plist 中,您指定输出到 /Users/frankg/hexo,但在脚本中,您将其重定向到 /tmp/MyLaunchdTest.out;我假设后者是你真正想要的? AIUI 你也可以使用 WorkingDirectory 键来替换 --cwd 选项。像这样:

<?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>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>com.localhost.hexo</string>
  <key>ProgramArguments</key>
  <array>
    <string>/path/to/hexo</string>
    <string>server</string>
  </array>
  <key>UserName</key>
  <string>frankg</string>
  <key>RunAtLoad</key>
  <true/>
  <key>StandardErrorPath</key>
  <string>/Users/frankg/hexo</string>
  <key>StandardOutPath</key>
  <string>/tmp/MyLaunchdTest.out</string>
  <key>WorkingDirectory</key>
  <string>/Users/frankg/dev/code/apps/blog</string>
</dict>
</plist>