关于.bash_profile,.bashrc,以及应该写入别名的位置?

时间:2009-05-24 02:37:22

标签: bash shell environment

  

可能重复:   What's the difference between .bashrc, .bash_profile, and .environment?

似乎如果我使用

alias ls='ls -F'

在Mac OS X上的.bashrc中,然后新创建的shell将没有该别名。我需要再次输入bash,该别名将生效。

如果我在托管公司登录Linux,.bashrc文件的评论行会显示:

  

对于非登录shell

并且.bash_profile文件的评论为

  

登录shell

那么别名应该写在哪里?为什么我们将登录shell和非登录shell分开?

有些网页上说使用.bash_aliases,但它似乎无法在Mac OS X上运行。

4 个答案:

答案 0 :(得分:154)

login 非登录 shell分开的原因是每次启动Bash的新副本时都会重新加载.bashrc文件。只有在您登录或使用适当的标志告诉Bash充当登录shell时才会加载.profile文件。

就个人而言,

  • 我将PATH设置放入.profile文件中(因为我有时会使用其他shell);
  • 我将我的Bash别名和函数放入我的.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 :(得分:114)

除了man bash之外,请查看 http://mywiki.wooledge.org/DotFiles以获取有关该主题的优秀资源。

要点:

  • 您只需登录一次,那就是读取并执行~/.bash_profile~/.profile的时间。由于您从登录shell运行的所有内容都继承了登录shell的环境,因此您应该将所有环境变量放在那里。与LESSPATHMANPATHLC_*一样,...例如,请参阅:My .profile
  • 登录后,您可以运行多个shell。想象一下登录,运行X,并在X中使用bash shell启动一些终端。这意味着您的登录shell启动了X,它继承了您的登录shell的环境变量,它启动了您的终端,启动了您的非登录bash shell。您的环境变量在整个链中传递,因此您的非登录shell不再需要加载它们。由于这个原因,非登录shell仅执行~/.bashrc,而不是/.profile~/.bash_profile,因此在那里定义仅适用于bash 的所有内容。这是函数,别名,仅限bash的变量,如HISTSIZE(这不是环境变量,不导出它!),包含setshopt的shell选项等。有关示例,请参阅:My .bashrc
  • 现在,作为UNIX特性的一部分,login-shell不执行~/.bashrc而只执行~/.profile~/.bash_profile,因此您应该从后者手动获取该{1}}。您也会看到我在我的~/.profile中执行此操作:source ~/.bashrc

答案 2 :(得分:12)

来自bash手册页:

  

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

     

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

     

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

因此,如果要为登录shell和交互式非登录shell获取相同的行为,则应将所有命令放在.bashrc.bash_profile中,然后使用另一个档案source第一个。

答案 3 :(得分:1)

为“登录shell”加载了

.bash_profile。我不确定在OS X上会是什么,但在X11或虚拟终端的Linux上。

每次运行Bash时都会加载

.bashrc。无论何时打开一个新的Terminal.app窗口,都应该放置你想要加载的东西。

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