![cron 忽略“.bashrc”和“.bash_profile”中定义的变量](https://linux22.com/image/29893/cron%20%E5%BF%BD%E7%95%A5%E2%80%9C.bashrc%E2%80%9D%E5%92%8C%E2%80%9C.bash_profile%E2%80%9D%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84%E5%8F%98%E9%87%8F.png)
我在 /etc/crontab 文件中定义了“SHELL”变量:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
此外,/etc/crontab 文件中的所有脚本都是在用户“martin”下启动的。然而/home/martin/.bash_profile(用于登录 shell)和/home/马丁/.bashrc(对于非日志记录 shell)包含一些在 cron 作业中被忽略的变量,但在我通过 SSH 登录到计算机或打开新的 bash 会话时使用。为什么 cron 会忽略这些变量? cron 不是简单地以用户“martin”的权限执行“/usr/local/bin/bash my-script.sh”吗?
答案1
您可以在脚本顶部或正在执行作业的用户的作业开头获取所需的文件。 “source”命令是内置的。如果您对这些文件进行编辑以加载更改,您也会执行相同的操作。
* * * * * source /home/user/.bash_profile; <command>
或者
#!/bin/bash
source /home/user/.bash_profile
<commands>
答案2
因为它不是交互式 shell。当您打开某些终端时也会发生同样的情况。
看看这个问题:.bashrc 文件是什么? |超级用户
还有这一点:
.bashrc、.bash_profile 和 .environment 之间有什么区别? |堆栈溢出
根据连接是登录 shell(或不是)、交互式 shell(或不是)或两者,触发不同的脚本。
如果你想创建 bashrc,你需要进行以下更改:
当 Bash 以非交互方式启动时,要运行 shell 脚本,例如,它会在环境中查找变量 BASH_ENV,如果它出现在那里,则扩展其值,并使用扩展后的值作为要读取和执行的文件的名称。 Bash 的行为就像执行了以下命令:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但 PATH 变量的值不用于搜索文件名。
如上所述,如果使用该
--login
选项调用非交互式 shell,Bash 会尝试从登录 shell 启动文件读取并执行命令。
答案3
source
如果sh
正在使用 shell,您可能无法运行。这可以通过在 crontab 中添加以下行来更改:
SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>
您还可以指定环境:
BASH_ENV="/root/.bashrc"
* * * * * <command>
/home/user/.bashrc
或者如果它是用户 cron 作业,您可以使用本地的(例如crontab -e
)。
请注意,如果存在,则.bash_profile
可以替换。.bashrc
答案4
其他可能会干扰您.bashrc
从 cronjob 获取的内容是该文件为检测交互式 shell 所做的任何检查。
例如,在 Ubuntu 18.04 上,.bashrc
用户的默认值以此开头:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
因此,采购它不会做任何有用的事情,因为它会立即退出。