除非手动启动,否则Bash不会读取.bashrc


22

bash.bashrc除非我bash从终端手动运行,否则不会从交互式终端获取信息:

$ bash

或手动获取:

$ source ./.bashrc

或正在运行:

$ st -e bash

我希望这是一些有用的输出:

$ echo $TERM
st-256color

$ echo $SHELL
/bin/sh

$ readlink /bin/sh
bash

$ shopt login_shell
login_shell     off

我使用的是CRUX Linux 3.0,并且使用dwmst。我尝试使用.bash_profile并且.profile没有成功。

有任何想法吗?

Answers:


19

为什么要采购?您运行不正确bash

$ echo $SHELL
/bin/sh

在大多数现代系统中,sh是基本外壳的符号链接。以我的Debian为例:

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Aug  1  2012 /bin/sh -> dash

就您而言,sh是的链接,bash但如中所述man bash

如果使用名称sh调用bash,则它会尝试尽可能接近于sh的历史版本的启动行为,同时也要符合POSIX标准。[...]当以名称为sh的交互式shell调用时,bash查找变量ENV,如果定义了变量,则扩展其值,并将扩展后的值用作要读取和执行的文件的名称。由于以sh调用的shell不会尝试从任何其他启动文件读取和执行命令,因此--rcfile选项无效。

--norc
如果外壳是交互式的,则不要读取和执行系统范围的初始化文件/etc/bash.bashrc和个人初始化文件〜/ .bashrc。 如果shell以sh调用,则默认情况下此选项为on。

因此,由于默认外壳为sh.bashrc因此不会读取。只需使用将默认shell设置为bash即可chsh -s /bin/bash


谢谢。自从/bin/sh指出,我认为没关系/bin/bash。我想这个问题源于/bin/bash我最初创建用户帐户时未显式分配外壳程序。
急速

还有,Debian / Ubuntu的切换,以dash用于/bin/sh为努力减少启动时间的一部分。当我的用户开始询问为什么他们的shell行为不同时,这很有趣。
kurtm

18

在.bash_profile中,确保您具有以下内容:

# .bash_profile

# If .bash_profile exists, bash doesn't read .profile
if [[ -f ~/.profile ]]; then
  . ~/.profile
fi

# If the shell is interactive and .bashrc exists, get the aliases and functions
if [[ $- == *i* && -f ~/.bashrc ]]; then
    . ~/.bashrc
fi

1
@terdon您的答案是正确的。我的回答只有在他跑步时才有效bash。不错,我错过了。
2013年

如果您bash与另一个shell一起运行(例如默认情况下ksh93使用).profile,这可能会让您头疼。
库沙兰丹

如果〜/ .bash_profile不存在,则可以创建它。
Pratik Singhal,2017年

在基于Debain的操作系统中为.bashrc,在CentOS / Fedora / Mac OS中为.bash_profile
Mitoxys 18/07/16
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.