~/.profile、~/.bashrc和~/.bash_profile在新终端启动时没有运行

29
我想为我的终端创建一个永久性别名。我将别名放在我的 ~/.profile、~/.bashrc 和 ~/.bash_profile 文件中,这些文件之前都是空的。当我打开一个新的终端时,bash 不认识这个别名,但如果我 source 它们中的任何一个,它就会识别。为什么打开终端时它们没有被运行?我使用的是 OSX 操作系统。

2
你在用什么终端?iTerm吗? - ptierno
11个回答

59

较新的MacOS版本在终端和iTerm2中默认使用zsh作为shell。运行echo $SHELL来确认这对你是否适用。

在shell启动时,Zsh会查找.zshrc文件,因此如果要继续使用zsh并同时引用您的bash配置文件内容,可以运行以下命令:

echo "source ~/.bash_profile" >> ~/.zshrc

打开一个新的终端窗口以使更改生效。


我该怎么撤销这个操作?它对我来说是有效的,但现在我的终端文本全部乱了。 - thenomadicmann
1
这是非常有缺陷的。你永远不应该让一个shell启动文件去源另一个shell的启动文件。 - tripleee
1
@thenomadicmann 你应该编辑 .zshrc 文件并删除你添加的 source 语句,它位于最后一行。 - tripleee
@tripleee 为了使你的反馈更有建设性,我建议你识别一些这种方法的风险并提出替代方案。 - lchapo
@lchapo 这里有几个其他方法的答案。我不认为在这里更详细地解释风险是必要的,而且我在其他评论中已经说过了;但是显然,在此文件中仅使用 Bash 语法将使其在任何不支持该语法的 shell 中崩溃。(Zsh 可以配置为理解 Bash 语法,但这会将您锁定到需要此配置选项,进而引起对优先使用 Zsh 而非 Bash 的基本原理的怀疑。) - tripleee

34

使用iTerm加载点文件需要完成两件事情。

首先,在.bash_profile中添加以下内容:

[[ -s ~/.bashrc ]] && source ~/.bashrc

其次,您需要确保在iTerm首选项中,您的终端已设置为启动登录 shell。

iTerm 首选项

希望这可以帮到您!


1
太好了!问题已经解决了!感谢你的帮助! - DazedAndConfused

20

使用默认的mac终端,对我有效的方法是添加一个命令,在启动时运行并读取我的.bash_profile文件。

首选项 > 概要 > 启动 > 添加命令 'source ~/.bash_profile'

Mac终端偏好设置窗口截图

可能被认为有点“hacky”,但确实能解决问题。


5

source ~/.profile添加到我的.bash_profile中对我起作用了。


3

从 High Sierra 开始,终端和 iTerm 都希望首先加载 ~/.profile。因此,我建议您在 .profile 中添加一行代码,使得 Mac 的工作方式与其他 Unix 系统相同:

source ~/.bash_profile

通过编辑这个文件,您不必搜索多个应用程序菜单来覆盖苹果在每个应用中的奇怪行为。


谢谢,你的想法帮了我很大的忙。 - Meghana Randad
这是不正确的,因为它会导致非Bash shell尝试源代码仅为Bash保留并可能包含其他shell不兼容的语法文件。(反过来做是无害的;编辑.bash_profilesource ~/.profile,该文件专门设计用于此目的。) - tripleee

3

从Catalina开始,默认的shell现在是zsh。您可以使用chsh -s /bin/bash将其改回bash,并且那应该加载您的.profile.bash_profile


请参考此帖子设置zsh上的nvm的详细步骤:https://dev59.com/OFYN5IYBdhLWcg3wuKK5#47017363 - Jeremy

3
为什么你的 shell 初始化文件没有加载?
像大多数事情一样,这要看情况。
我最近遇到了相同的现象,并进行了以下操作来解决它:
我使用 iTerm。iTerm 默认运行登录 Shell。在 iTerm 偏好设置 > 通用 > 命令 > (*) 登录 Shell 中验证。
因此,我知道 ~/.bash_profile 总是会被调用。
知道了这一点,我在我的 ~/.bash_profile 文件中加入了以下内容:
for file in ~/.{bashrc,bash_exports,bash_aliases,bash_functions}; do
    [ -r "$file" ] && source "$file"
done
unset file

请注意,我使用单独的文件来存储 .bashrc、.bash_exports 等。这样可以使事情分离和简单。
还要注意 /etc/profile 被首先加载,但由于我从未使用过该系统范围的 init 文件,我知道那不是我的问题。有关详细信息,请查看 $ man bash。
因此,我从我的 ~/.bash_profile 文件开始。
我发现当我安装 Canopy Express 时,它的安装程序用以下内容替换了我的 ~/.bash_profile 文件的内容:
# Added by Canopy installer on 2017-04-19
# VIRTUAL_ENV_DISABLE_PROMPT can be set to '' to make the bash prompt show that Canopy is active, otherwise 1
alias activate_canopy="source '/Users/lex/dev/python/User/bin/activate'"
# VIRTUAL_ENV_DISABLE_PROMPT=1 source '/Users/lex/dev/python/User/bin/activate'

p.s. Canopy是一个非常好用且免费的Python IDE,我强烈推荐使用。

幸运的是,我备份了我的~/.bash*文件,因此恢复很容易,快速解决了我的问题。

我的建议是了解初始化文件的调用顺序,从第一个开始逐个排查,直到找到问题所在。

哦,还有你可能需要验证一下你正在使用哪个shell(我使用bash):

~ $ echo $SHELL
/usr/local/bin/bash

1

虽然有点晚了,但看起来在加载zsh时,.zprofile文件相当于.bash_profile文件。我使用它来在启动时执行一些命令。当然,这只适用于特定的iTerm设置和zsh。

https://zsh.sourceforge.io/Intro/intro_3.html


谢谢,将.bash_profile复制到.zprofile并重新启动终端对我起了作用。 - Nipazz

0

我的问题通过取消勾选偏好设置>常规>tmux>来解决。

使用“tmux”配置文件而不是连接会话的配置文件


0

我猜你可能使用了其他的shell,比如bash、tcsh、sh、zsh等。

source .bash_profile放入你适当的'bashrc'文件中,将使自动加载恢复,即:

对于tcsh,使用.login;对于bash,使用.bash_profile;对于zsh,使用.zshrc。


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