码农家园

关闭
导航

关于macOS:从zsh进入bash时如何加载?/ .bash_profile?


bashmacosshellunixuser-profile

How to load ~/.bash_profile when entering bash from within zsh?

我已经使用bash两年了,只是尝试通过自制程序在OS X上切换到zsh shell。 然后将默认(登录)shell设置为zsh,并通过查看启动终端时使用的默认zsh shell来确认设置正确。

但是,当我尝试从zsh中进入bash shell时,好像没有加载~/.bash_profile,因为我无法使用别名来运行命令,别名是在~/.bash_profile中定义的,例如alias julia="~/juila/julia"等。 提示不是我在文件中设置的,而是返回bash-3.2$。

由于某些原因,当我将登录shell设置为bash并从bash中输入zsh时,将正确加载~/.zshrc。

那么,为什么每当我在zsh中运行bash时都不会加载它? 我的~/.bash_profile符号链接到~/Dropbox/.bash_profile以便与其他计算机同步。 也许引起问题吗?

相关讨论

  • 运行source ~.bash_profile后,别名是否可用?


打开~/.zshrc,然后在文件的最底部添加以下内容:

1
2
3
if [ -f ~/.bash_profile ]; then
    . ~/.bash_profile;
fi

每次打开终端时,它将加载~/.bash_profile中定义的任何内容(如果文件存在)。这样,您就可以保留zsh的自定义设置(颜色等)。您可以将自定义外壳程序设置保留在.bash_profile文件中。

这比使用bash -l IMO更清洁。

如果您希望将设置放入.bashrc,.bash_login或.profile,则可以对它们进行相同的操作。

相关讨论

  • 好,易于 :)


如果交互式bash是登录Shell,则读取~/.bash_profile;如果不是登录Shell,则读取~/.bashrc。

典型的.bash_profile将包含以下内容:

1
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

因此.bashrc可以包含要由登录或非登录外壳程序执行的命令。

如果您运行bash -l而不是仅运行bash,它应该读取您的.bash_profile。

参考:https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html

相关讨论

  • 谢谢。我在~.bash_profile的顶部定义了~.bashrc加载,但是定义了几乎所有设置,包括我的~.bash_profile而不是~.bashrc中的别名和环境变量。并且我确认bash -l从zsh内成功加载了它。
  • 我不知道为什么oh-my-zsh更新,它会删除对.zshrc的所有更改。


为了补充@Keith Thompson的出色答案:

苹果系统:

正如@chepner简洁地说(强调我的):

In OS X, bash is not used as part of the initial [at boot time] login process, and the Terminal.app (or other terminal emulators) process exists outside any pre-existing bash sessions, so each new window [or tab - read: interactive bash shell] (by default) treats itself as a new login session.

结果,某些OSX用户只能创建~/.bash_profile,而不会使用~/.bashrc,因为所有交互式bash shell都是登录shell。

Linux:

在Linux上,情况通常是相反的:
交互式创建的bash shell是[interactive] NON-login shell,因此重要的是~/.bashrc。

结果,许多Linux用户只使用~/.bashrc。

要维护在两个平台上均可使用的bash配置文件,请使用@Keith Thompson提到的技术:

  • 将您的定义(别名,函数等)放在~/.bashrc中
  • 将以下行添加到~/.bash_profile
1
[[ -f ~/.bashrc ]] && . ~/.bashrc
相关讨论

  • 感谢您的出色跟进!您如何考虑我只将if [ -f ~.bashrc ]; then . ~.bashrc; fi留在~.bash_profile中,并将其他所有内容移至~.bashrc的想法?
  • @Gardecolo:我认为这是个好主意(在很大程度上是假设性的警告:在引导期间创建bash登录会话的平台上-如所述,OSX不是其中之一-您可能会争辩说所有export语句都应进入~.bash_profile,因为它们只需要执行一次,并且不需要为每个新的bash shell重复它们-但是,实际上,我怀疑这很重要)。


从?/ .bash_profile复制内容,并将其粘贴到?/ .zshrc文件的底部。

相关讨论

  • 谢谢,这是我的解决方案:)


对于刚刚安装zsh并希望其bash别名在zsh上运行的用户,请执行以下操作

  • 像这样在vim中打开.zshrc文件

    1
     vi ~/.zshrc
  • 滚动到底部

  • 单击" i"以启用写入模式
  • 告诉zsh必要时从bash_profile加载项目

    1
    source ~/.bash_profile
  • 像这样写然后退出

    1
    :wq
  • 像这样刷新您的zsh

    1
    source ~/.zshrc

    而已。现在,您在.bash_profile中保存的所有别名都可以在zsh中使用。


  • 对于MacOs上的ZSH用户,我最终得到了一线。

    在?/ .zshrc的最底部,我添加了以下行:

    1
    bash -l

    它的作用就是简单地加载.bash_profile设置(别名,函数,导出$ PATH等)。

    如果您决定摆脱ZSH并返回普通BASH,则将毫无麻烦地恢复正常。

    相关讨论

    • 这可以工作,但是会在zsh内创建另一个bash shell,并且您会丢失zsh功能和颜色。
    • 取而代之的是,在~.zshrc文件的最底部添加source ~.bash_profile。


    如果您不经常这样做,或者不适合进行更改,则还可以在启动子bash shell之后"获取" .bash_profile。

    1
    . ~/.bash_profile

    这将提取您在.bash_profile脚本中所做的设置,以用于该Shell会话的整个生命周期。在大多数情况下,您应该能够重复该命令,因此这也是测试您所做的任何更改的简便方法,而无需进行完整的登录,并且可以使所有现有的Shell会话保持最新您可以升级到.bash_profile和/或.bashrc文件。


    最近,我在OS X上安装了oh-my-zsh并将zsh设置为默认外壳并面临相同的问题。
    我通过在.zshrc文件末尾添加source ~/.bash_profile解决了此问题。


    Copyright ©  码农家园 联系:[email protected]