为非交互式 shell 设置环境变量

10

我正在尝试为非交互式非登录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,它将只加载默认的按键映射。


为什么设置 BASH_ENV 会影响你的 xkb 设置?你是将其设置为包含更改键位布局代码的文件名吗?你尝试过不这样做吗? - that other guy
我将$BASH_ENV设置为一个脚本,其中包含一些“export”,以便具有一些默认环境变量。与xkb无关。 - Trung Quan Vo
抱歉我之前的假设是错误的。XKB 仍然可以正常工作。问题出在 ~/.xbindkeysrc 文件上。我在 rc.local 文件中添加了一行代码,但当设置 BASH_ENV 时,它就无法工作了。但我只是想知道为什么添加 export VAR=something 会无效。 - Trung Quan Vo
我尝试在~/.bashrc中设置一个变量,当使用“ssh host script”时,该变量可供使用。您能否详细说明您的情况? - czvtools
3
好的,对于Ubuntu的解决方案是:在/etc/environment中设置变量,这将适用于所有用户和所有类型的shell……如果一开始我就知道这个就好了。 - Trung Quan Vo
显示剩余6条评论
2个回答

16

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


2
那么对于非交互式 shell,无法设置特定用户的环境变量吗? - wuarmin
也许这与问题有些边缘关系,但如果您在Ubuntu容器中运行bash,即docker run --rm -ti ubuntu:18.04 /bin/bash,那么/etc/environment将被完全忽略。我不知道是否有一种模式可以加载该文件,除非使用BASH_ENV。 - init_js
1
@wuarmin 显然答案是BASH_ENV。请查看https://serverfault.com/a/593487/951855 - Ahmad Ismail

1
细节有些依赖于平台。参考手册中的Bash Startup Files描述了Bash本身的默认行为;但您还需要考虑您特定平台的行为。
一般来说,对于非交互式“登录”shell,会执行$HOME/.bashrc,但不能保证任何脚本都能在非交互式非登录shell上运行。您可以通过从父shell设置(并导出!)BASH_ENV到要在启动非交互式shell时执行的脚本名称来强制执行它。
有时,一个可接受的解决方法是在登录shell中运行一个脚本,并相信您运行的非交互式非登录脚本继承了您在登录shell中设置的任何参数。例如,这就是/etc/environment可以做到的;但它不会强制在随后启动非交互式shell时运行脚本(当然,如果您使用/etc/environment设置BASH_ENV如上所述,则会强制运行)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接