在 launchd 脚本中使用环境变量

在 launchd 脚本中使用环境变量

我很好奇是否可以在ProgramArgumentsMac OS X Leopard 上的 luanchd 脚本部分指定环境变量。

<?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>me.mpietz.MountDevRoot</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>

        <string>$HOME/bin/attach-devroot.sh</string>

        <!-- Instead of using...
        <string>/Users/mpietz/bin/attach-devroot.sh</string -->
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

答案1

不在 ProgramArguments 键中。您需要EnvironmentVariables在 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>EnvironmentVariables</key>
    <dict>
           <key>AN_ENVIRONMENT_VARIABLE_NAME</key>
           <string>the_value</string>
    </dict>
    <key>Label</key>
    <string>me.mpietz.MountDevRoot</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>

        <string>$HOME/bin/attach-devroot.sh</string>

        <!-- Instead of using...
        <string>/Users/mpietz/bin/attach-devroot.sh</string -->
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

看:创建启动守护进程和代理

答案2

处理此问题的最佳方法是将命令包装在 shell 中。例如:

<?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>
    <false/>
    <key>Label</key>
    <string>sh.daniel.envvar</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/zsh</string>
        <string>-c</string>
        <string>echo 'You did the thing!' > $HOME/did-the-thing.log</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
❯ cat ~/did-the-thing.log
You did the thing!

该标志-c告诉 ZSH(以及 Bash 和 sh)运行您在下一个中指定的命令。如果您添加该标志-l,它将在执行之前加载您的点文件,就像普通登录 shell 一样。

答案3

我认为 launchd 本身并不了解环境,至少不是作为 ${VARIABLE} 替换。

但是没有什么可以阻止您启动 shell 脚本(或带有的 shell -c)作为您的启动操作,并且它将具有环境并尊重 ${VARIABLES}——但是在这种情况下请注意系统和用户守护进程/代理之间的区别......

答案4

我不确定 - 我以前没有尝试过...但我可以告诉你,如果你关心的唯一变量是家 - 你可以使用〜。

So: <string>~/bin/attach-devroot.sh</string>

相关内容