我试图为非交互式非登录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,它只会加载默认的键映射。
答案 0 :(得分:2)
Ubuntu解决方案:在/etc/environment
中设置变量,它适用于所有用户和所有类型的Shell。
答案 1 :(得分:0)
细节在某些程度上取决于平台。参考手册中的Bash Startup Files描述了Bash本身的默认行为。但是您还需要考虑特定平台的行为。
通常,$HOME/.bashrc
是针对非交互式 login shell执行的,但不能保证脚本不能针对非交互式非login shell运行。您可以通过将BASH_ENV
从父shell设置(并导出!)来强制启动非交互式shell时要执行的脚本的名称。
有时,一种可接受的解决方法是在登录Shell中运行脚本,并相信您运行的非交互式非登录脚本会继承您在登录Shell中设置的任何参数。这就是例如/etc/environment
可以做到;但不会强制随后启动非交互式shell时运行一段脚本(当然,除非您如上所述使用/etc/environment
来设置BASH_ENV
)。