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

时间:2017-03-10 18:38:47

标签: linux bash shell

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

2 个答案:

答案 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)。