为非交互式外壳设置环境变量



我正在尝试为非交互式非登录 shell 设置环境变量。我知道 bash 在执行命令之前会读取 ~/.bashrc 的内容。在脚本的开头有一个部分:

*# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac*

所以我认为如果我在上面添加一些东西,无论 shell 是否是交互式的,它都会生效:

export VAR=something
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac

但是,它:(不起作用。我想避免使用 $BASH_ENV,因为它弄乱了我的 xkb 设置。我在/usr/share/X11/xkb/symbols/pc 中重新映射了一些键。如果我设置 $BASH_ENV,它只会加载默认键盘映射。

Ubuntu 的解决方案:在/etc/environment中设置变量,它适用于所有用户和所有类型的 shell。

细节在某种程度上取决于平台。参考手册中的 Bash 启动文件描述了 Bash 本身的默认行为;但是您还需要考虑特定平台的行为。

通常,$HOME/.bashrc是针对非交互式登录shell 执行的,但不能保证对非交互式非登录 shell 运行任何脚本。 您可以通过设置(和导出! 从父 shellBASH_ENV为启动非交互式 shell 时要执行的脚本的名称。

有时,可接受的解决方法是在登录 shell 中运行脚本,并相信您运行的非交互式非登录脚本会继承您在登录 shell 中设置的任何参数。 这就是例如/etc/environment可以做到;但它不会强制一段脚本在随后启动非交互式 shell 时运行(当然,如果您如上所述使用/etc/environment来设置BASH_ENV,则除外)。

最新更新