如何保证 $BASH_ENV 的可用性

Igo*_*rio 7 bash environment-variables

非交互式、非登录 shell 将尝试获取 $BASH_ENV 中指定的任何脚本。但是如何保证在 cron 作业或脚本有机会为任何特定会话设置 $BASH_ENV 之前设置 $BASH_ENV ?使用硬编码来编译 Bash 是唯一的选择吗?

Gil*_*il' 8

如果您希望 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
Run Code Online (Sandbox Code Playgroud)

如果您只想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
Run Code Online (Sandbox Code Playgroud)

如果您希望特定脚本始终加载某些配置文件,请直接从脚本中加载它。

#!/bin/bash
. /path/to/configuration.bash
…
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 4

BASH_ENV仅在非交互式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
Run Code Online (Sandbox Code Playgroud)

没有为用户在非交互式 shell 中运行的标准文件。您应该将其设置在单独的文件中,然后获取它:

bash -c '. ~/.profile; echo 123'
Run Code Online (Sandbox Code Playgroud)

或者您可以在某些系统范围的配置文件中设置它,例如/etc/environment/etc/bashrc.bashrc