我每天都会在中午启动一个 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 作为(无用的)父进程挂起。