是否存在一个Bash文件,无论是登录还是非登录,该Bash文件都将始终以交互方式提供?


10

据我所知,交互式外壳可能是登录的,也可能不是登录的,它们的启动文件是不同的。

  • 如果交互式+登录shell→ /etc/profile然后第一可读~/.bash_profile~/.bash_login~/.profile
  • 如果是交互式+非登录外壳→ /etc/bash.bashrc~/.bashrc

我想每次使用交互式外壳程序时都设置一些变量,而不管它是否是登录外壳程序。



1
@strugee不,这个问题与环境变量无关。
吉尔(Gilles)'所以

@吉尔斯是的,但您的回答同样适用。
2014年

1
@strugee那是因为我超越了紧迫的问题,而涉及了一个外围话题。一个答案中的一个段落不会重复。如果问题的答案基本相同,则它们只是重复项,如果一个答案恰巧包含足够的材料来回答第二个问题,则不是重复题。
吉尔(Gilles)'所以

Answers:


10

不,没有。是的,这是设计缺陷。

在中使用以下内容~/.bash_profile

if [ -e ~/.profile ]; then . ~/.profile; fi
if [[ -e ~/.bashrc && $- = *i* ]]; then . ~/.bashrc; fi

请注意,bash有一个奇怪的怪癖:当它是一个非交互式的登录shell,并且其父进程是rshdor时sshd,bash源~/.bashrc(但不是~/.bash_profileor ~/.profile)。因此,您可能希望将其放在您的顶部.bashrc

if [[ $- != *i* ]]; then return; fi

另见的.bashrc和.bash_profile文件之间的差异登录shell和非登录shell之间的区别是什么?


这些怪癖是出于安全原因(在对安全性敏感的设置中运行时,请勿加载意外的文件)。
vonbrand 2014年

2
@vonbrand Er,什么?不,这些怪癖与安全性完全无关。没有涉及“意外的文件”(除了.bashrc以非交互设置加载实际上可能算作意外的),也没有对任何对安全敏感的上下文进行检查。
吉尔(Gilles)'“ SO-别再作恶了”

有这种防止循环的方法吗?
Braiam 2014年

1
@Braiam什么循环?
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.