非交互式、非登录 shell 将尝试获取 $BASH_ENV 中指定的任何脚本。但是,如何保证在 cron 作业或脚本有机会为任何特定会话设置 $BASH_ENV 之前设置 $BASH_ENV 呢?硬编码是编译 Bash 的唯一选择吗?
答案1
如果您希望加载 crontab 中的所有 bash 脚本BASH_ENV
,请将其设置在 crontab 级别。
BASH_ENV=/path/to/startup.bash
12 34 * * * /path/to/bash_script
1 23 1 * * /path/to/other_bash_script
如果您只想BASH_ENV
为特定条目进行设置,请将其设置在那里。然后BASH_ENV
不会为 crontab 本身中列出的代码设置,但无论如何在那里放置任何复杂的内容都是一个坏主意。
12 34 * * * export BASH_ENV=/path/to/startup.bash; /path/to/bash_script
1 23 1 * * /path/to/other_bash_script
如果您希望特定脚本始终加载某些配置文件,请直接从脚本内加载它。
#!/bin/bash
. /path/to/configuration.bash
…
答案2
BASH_ENV
仅在a中读取非交互式shell,并且仅当该 shell 是 bash 时(并且也不以名称调用sh
)。非登录交互式 shell 不会查找$BASH_ENV
:
$ export BASH_ENV=/home/cuonglm/bash-env.sh
$ bash -lci '. test.sh'
QWERTY
$ bash -lc '. test.sh'
BASH_ENV read
QWERTY
$ bash -ci '. test.sh'
QWERTY
$ bash -c '. test.sh'
BASH_ENV read
QWERTY
没有为用户在非交互式 shell 中运行的标准文件。您应该将其设置在单独的文件中,然后获取它:
bash -c '. ~/.profile; echo 123'
或者您可以在某些系统范围的配置文件中设置它,例如/etc/environment
或/etc/bashrc.bashrc
。