【问题标题】:Cygwin cron reads bash_profile but not bashrcCygwin cron 读取 bash_profile 但不读取 bashrc
【发布时间】:2020-04-28 14:22:09
【问题描述】:

我正在尝试使用 Cygwin 在我的 Windows 机器上运行一个 cronjob,它需要访问我在 ~/.bashrc 中定义的环境变量。这是我试图让它访问 env 变量的所有不同的东西:

  1. 简单的 bashrc 源码
PATH=/bin:/usr/bin:/usr/local/bin:$PATH
SHELL=/usr/bin/bash
*/1 * * * * source ~/.bashrc ; env | grep "MAP60" 
  1. 调用 bash 并运行命令
PATH=/bin:/usr/bin:/usr/local/bin:$PATH
SHELL=/usr/bin/bash
*/1 * * * * /usr/bin/bash -c "source ~/.bashrc ; env | grep MAP60"
  1. 尝试 bash 登录 shell
PATH=/bin:/usr/bin:/usr/local/bin:$PATH
SHELL=/usr/bin/bash
 */1 * * * * /usr/bin/bash -lc " source ~/.bashrc ; env | grep MAP60"

这些都不起作用,但是如果我将变量添加到我的 ~/.bash_profile 中,情况 3 会起作用。我还尝试使用完整路径采购 bashrc,并且还使用 .而不是源来调用文件。我也尝试过像案例 1 一样直接采购 bash_profile,但这也不起作用。我希望在 ~/.bashrc 中调用变量,而不是每次都调用登录 shell。如何使用 cygwin cron 实现这一目标?

【问题讨论】:

  • 您的 .bashrc 是否可能在非交互模式下出错或跳过部分?您是否尝试过从 cron 作业中捕获错误输出? /usr/bin/bash -lc " set -x; source ~/.bashrc ; env | grep MAP60" 2>/tmp.error.log 怎么样

标签: bash cron environment-variables cygwin


【解决方案1】:

为我(和其他所有人)工作。所以你的设置有问题。我在 Cygwin 上没有 cron 设置,但很可能它无法通过电子邮件向您发送命令的输出(这通常是真实 UNIX 上的默认设置)。首先修改你的第三个例子:

*/1 * * * * /usr/bin/bash -xlc " source ~/.bashrc ; env | grep MAP60" >/tmp/x 2>&1

然后查看/tmp/x的内容。

注意:对于交互式 shell,Bash 只读取 ~/.bashrc。使用 -l 不会使 shell 交互。不建议将 var 定义放在 ~/.bashrc 中。但是如果你想这样做,你应该确保只有在 shell 是交互式的情况下才应该运行的任何命令都在 ~/.bashrc 中的 if [[ $- = *i* ]]; then ...; fi 块内。

【讨论】:

  • 嗨@Kurtis Rader,cron 能够毫无问题地向我发送电子邮件,并且每次我运行我在没有 grep 的问题中发布的示例之一时,我都可以看到所有 env变量,很明显我的变量没有被拉到这里。我应该将其添加到我的问题中。在大多数 unix 系统上的 cron 中,在调用脚本之前获取 bashrc 或 bash_profile 将允许您加载这些变量,但在 Cygwin 上则不能。我不知道 bashrc 仅适用于交互式 shell - 现在它为什么没有读取我的 bashrc 是有道理的,尽管它已成为登录 shell。谢谢!
  • 我不明白您所说的“我的变量没有被拉到这里”是什么意思。你的意思是它不在env 输出中吗?或者它在环境中并且grep 与该行不匹配?另外,如果您进行实验,我建议 /tmp/x 中的内容是什么?你的 ~/.bashrc 里有什么?或者,如果它太大,什么语句会导致 var MAP60 被定义?
  • 正如我在上一条评论中提到的,我在没有 grep 的情况下运行了每个示例,并且 MAP60 不在 env 输出中,也没有从 bashrc 文件中提取。 MAP60 是用一个非常通用的export 命令定义的,这绝对不是问题。您的实验只给出了一个空的 /tmp/x 文件,考虑到变量并没有从一开始就从 bashrc 加载,这是预料之中的。
  • 不,/tmp/x 不应为空。至少应该有这两行:+ source /Users/krader/.bashrc+ env 以及 env 的输出。
  • 我很抱歉 - 我正在运行 /usr/bin/bash -xlc " source ~/.bashrc ; env | grep MAP60 > /tmp/x" 2>&1 ,这显然与您的建议不同。看起来它正在采购我的 bashrc,但我没有看到 grep 的任何输出。这条线readonly PROFILEREAD=true 有什么不同吗?我不确定该变量是否会导致正确获取 bashrc 的问题。
猜你喜欢
  • 2019-05-07
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 2012-05-29
  • 2016-03-03
  • 2017-01-17
  • 1970-01-01
相关资源
最近更新 更多