尝试在运行时扩展 launchdaemon 的参数

尝试在运行时扩展 launchdaemon 的参数

我每天都会在中午启动一个 shell 脚本。我尝试将前一天的日期作为该脚本的参数传入启动守护进程的 .plist 中,但根据 stdout 和 stderr 日志,它无法运行。

我现在在 zshell 中手动运行我的脚本(并且运行良好):./my_script.sh --optionone $(date -v -1d +"%m/%d/%y") --optiontwo

<key>ProgramArguments</key>
<array>
    <string>/Users/kanejm/scripts/my_script.sh</string>
    <string>--optionone</string>
    <string>/bin/date -v -1d +"%m/%d/%y"</string>
    <string>--option2</string>

我的错误消息说参数太多。我假设 launchd 没有在我创建的 .plist 中扩展我的参数。

usage: %prog [options]: error: unrecognized arguments: -v -1d +"%m%d%y"`/directory-`bindate -v -1d +"%m%d%y"` -v -1d +"%m/%d/%y"`

我做过几个配置,但都没用。也就是说,<string>variable</string>每个空格都有一个键。我还尝试用$()and `` 包围 plist 中的变量,但无济于事。我在网上找不到有关 launchd 参数中变量扩展的其他任何信息。也许我策略上做错了?任何指点都将不胜感激。

答案1

launchd 不会像 shell 那样解析参数——它只是将它们视为文字字符串。这大致就像 shell 对待每个参数的方式一样,如果每个参数都括在单引号中。(有一个可能的例外:如果您将键设置EnableGlobbing为 true,它将扩展文件名通配符。)

如果您想要 shell 样式的解析/扩展,则需要通过 shell 运行命令。如下所示:

<key>ProgramArguments</key>
<array>
    <string>/bin/zsh</string>
    <string>-c</string>
    <string>exec /Users/kanejm/scripts/my_script.sh --optionone "$(/bin/date -v -1d +"%m/%d/%y")" --option2</string>
</array>

请注意,脚本名称及其参数将作为单个 传递string,因为zsh -c期望将要执行的整个命令作为单个参数传递给它(然后命令字符串中的空格具有其通常的功能,即分隔命令、参数等)。这相当于在命令行上运行此命令:

/bin/zsh -c 'exec /Users/kanejm/scripts/my_script.sh --optionone "$(/bin/date -v -1d +"%m/%d/%y")" --option2'

另外,请注意,我在命令前面添加了exec-- 这将使zsh脚本在与zsh(本质上,zsh将退出并用运行脚本的新 shell 替换自身)相同的进程中运行,而不是让脚本作为子进程运行,而 shell 作为(无用的)父进程挂起。

相关内容