在 zsh 和 bourne shell 之间共享环境变量(用于 crontab)

在 zsh 和 bourne shell 之间共享环境变量(用于 crontab)

我在 .zshrc 中设置 JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/

这对于交互式程序来说很好。但我有通过 cron 运行的 JVM 程序,它使用 Bourne shell。 bourne shell 程序不断给我这个:

groovy: JAVA_HOME is not defined correctly, can not execute: /usr/lib/jvm/default-java/bin/java

解决这个问题最巧妙的方法是什么?我不记得以前需要担心这个。目前,我在每个 crontab 条目上设置 JAVA_HOME,这是繁重且多余的。

答案1

假设您指的是您自己用户的 crontab,为了避免重复定义,JAVA_HOME您可以使用(而不是)export中的变量,即使在非交互式、非登录 shell 中也会读取该变量,并在您的 cron 作业中运行(替换, 基于如果合适的话,您的问题中称为“Bourne shell”的程序实际上是什么)。~/.zshenv~/.zshrczsh -c 'sh /path/to/script'sh

或者,如果您可以JAVA_HOME在多个位置进行定义,并且您的sh实现支持此1,则可以通过附加到脚本的 shebang 或将 cron 作业的命令更改为 1 来将export其作为登录 shell~/.profile进行调用。sh-lsh -l /path/to/script

不过,最后,最方便的解决方案可能是简单地添加

JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/

作为 crontab 顶部的一行(JAVA_HOME当然,除非您有不同的 cron 作业需要不同的值)。


1 你的sh,即不太可能一个“真正的”Bourne shell,-l如果它实际上是(例如)bashdash.作为斯蒂芬·查泽拉斯指出在一个评论, 1) 如果它是 Bourne shell 或 的实现,则没有它POSIXsh(例如,在 {Free,Net,Open}BSD 上sh没有选项); -l2)并非所有支持的实现在给出该选项时-l都会读取。~/.profile

答案2

您可以分别在两个系统范围的配置文件中进行设置/etc/bash.bashrc/etc/bashrc在非 Debian 系统上)和/etc/zsh/zshenv/etc/zshenv

由于语法是一样的,直接复制粘贴即可

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/

在两个文件中

相关内容