别名应该放在 .bashrc 还是 .bash_profile 文件中?

148

可能是重复问题: .bashrc、.bash_profile 和 .environment 有什么区别?


我发现,如果使用

alias ls='ls -F'

如果在Mac OS X的.bashrc中添加alias,那么新创建的shell将不会具有该别名。我需要再次输入bash,然后该别名才会生效。

如果我登录到托管公司上的Linux,则.bashrc文件有一行注释:

对于非登录Shell

.bash_profile文件有一行注释:

对于登录Shell

那么别名应该写在哪里?为什么要分离登录Shell和非登录Shell?

某些网页说要使用.bash_aliases,但在Mac OS X上似乎无效。


13
哦,这很愚蠢。这个问题已经存在了将近两年的时间。它并不是一个完全重复的问题,因为这个问题要求提供规范建议(应该怎么做)。 - Charlie Martin
别名应该被放进历史垃圾箱里。使用函数。 - William Pursell
4个回答

188
拆分“登录”和“非登录”shell的原因是因为每次启动新的Bash副本时都会重新加载`.bashrc`文件。只有您登录或使用适当的标志告诉Bash充当登录shell时,才会加载`.profile`文件。
个人建议:
- 我将我的`PATH`设置放入`.profile`文件中(因为我有时使用其他shell); - 我将我的Bash别名和函数放入`.bashrc`文件中; - 我在`.bashrc`文件中放了这个
#!/bin/bash
#
# CRM .bash_profile Time-stamp: "2008-12-07 19:42"
#
# echo "Loading ${HOME}/.bash_profile"
source ~/.profile # get my PATH setup
source ~/.bashrc  # get my Bash aliases
  • 我的.bash_profile文件中。

哦,你需要再次键入bash以获取新的别名的原因是Bash在启动时加载.bashrc文件,但除非告诉它,否则不会重新加载。您可以通过键入以下命令重新加载.bashrc文件(而不需要第二个shell)

source ~/.bashrc

这个命令会加载.bashrc文件,就像你直接在Bash中键入了这些命令一样。


1
应该反过来:.bash_profile 引用 .bashrc,第一次登录后使用非登录 shell。 - 0 _
8
请再读一遍我说的话。 - Charlie Martin
1
每当一个bash进程启动时。比如我执行:$ bash $ bash $ bash那么我就有四个bash进程在运行。每个进程都会加载.bashrc文件。 - Charlie Martin
这只需要三个调用bash,那么这不会产生三个bash进程吗?一个bash进程不是必须在下一个开始之前终止,或者由于某种原因它们可以并行运行吗? - HelloGoodbye
1
@CharlieMartin 我还想指出,如果您打开另一个shell并使用login登录不同的用户 - 拥有命令source ~/.profilesource ~/.bashrc将不会从新登录的用户的主文件夹中获取源代码,而是从你登录计算机时使用的用户的主文件夹。也许有其他解决方案可以替代使用~/ - John
显示剩余8条评论

144

请查看http://mywiki.wooledge.org/DotFiles,除了man bash以外,这是一个关于该主题的绝佳资源。

概述:

  • 您只需登录一次,即在读取和执行~/.bash_profile~/.profile时。由于您从登录shell运行的所有内容都继承了登录shell的环境,因此应将所有环境变量放在其中。例如LESSPATHMANPATHLC_*等。例如,请参见:我的.profile
  • 登录后,您可以运行更多的shell。想象一下登录,运行X,在X中启动几个带有bash shell的终端。这意味着您的登录shell启动了X,并继承了您的登录shell的环境变量,启动了您的终端,启动了您的非登录bash shell。您的环境变量在整个链路中传递,因此您的非登录shell不需要再加载它们。非登录shell仅执行~/.bashrc,而不执行/.profile~/.bash_profile,正是出于这个原因,在其中定义仅适用于bash的所有内容。例如函数、别名、仅适用于bash的变量(如HISTSIZE,这不是环境变量,请勿导出!)、使用setshopt的shell选项等。例如,请参见:我的.bashrc
  • 现在,作为UNIX的奇特之处,登录shell不会执行~/.bashrc,而只会执行~/.profile~/.bash_profile,因此您应该从后者手动源该文件。您也可以在我的~/.profile中看到我这样做:source ~/.bashrc

  • 9
    这个回答应该得到更多的赞。我现在已经是第四次回来查找相关信息了。 - sjas
    另请参见:https://blog.flowblok.id.au/2013-02/shell-startup-scripts.html - codeforester
    以下两个链接-解决了我多年的困惑 https://linuxize.com/post/bashrc-vs-bash-profile/ https://medium.com/@abhinavkorpal/bash-profile-vs-bashrc-c52534a787d3 - Karan Kaw

    13

    根据bash manpage的描述:

    当bash作为一个交互式登录shell启动时,或者带有--login选项的非交互式shell启动时,如果文件/etc/profile存在,则首先读取和执行该文件中的命令。在读取该文件之后,它会依次查找~/.bash_profile~/.bash_login~/.profile文件,并从第一个存在且可读的文件中读取和执行命令。当启动shell时可以使用--noprofile选项来禁止此行为。

    当一个登录shell退出时,如果文件~/.bash_logout存在,则bash将读取并执行该文件中的命令。

    当启动一个非登录的交互式shell时,如果文件~/.bashrc存在,则bash将读取和执行该文件中的命令。这可以通过使用--norc选项来阻止。而--rcfile选项强制bash从指定文件中读取和执行命令,而不是~/.bashrc文件。

    因此,如果您想让登录shell和非登录交互shell具有相同的行为,则应将所有命令放在.bashrc.bash_profile文件中,然后让另一个文件source第一个文件。


    4

    .bash_profile 文件会在“登录 shell”运行时被加载。我不确定在 OS X 上是什么情况,但在 Linux 上,这通常指 X11 或虚拟终端。

    .bashrc 文件会在每次运行 Bash 时加载。你应该将想要在打开新的 Terminal.app 窗口时自动加载的内容放在这里。

    我个人将所有内容都放在 .bashrc 中,这样就不需要重新启动应用程序才能使更改生效。


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