142

可能重复: .bashrc、.bash_profile 和 .environment 之间有什么区别?

看来,如果我使用

alias ls='ls -F'

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

如果我在托管公司登录 Linux,该.bashrc文件有一个注释行,上面写着:

对于非登录外壳

.bash_profile文件有一条评论说

用于登录外壳

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

一些网页说使用.bash_aliases,但它似乎不适用于 Mac OS X。

4

4 回答 4

182

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

亲自,

  • 我将我的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 键入命令一样。

于 2009-05-24T02:42:47.533 回答
138

查看http://mywiki.wooledge.org/DotFiles除了man bash.

概括:

  • 您只需登录一次,这就是读取和执行~/.bash_profileor的时间。~/.profile由于您从登录 shell 运行的所有内容都继承了登录 shell 的环境,因此您应该将所有环境变量放在那里。像LESS, PATH, MANPATH, LC_*, ... 例如,请参阅:我的.profile
  • 登录后,您可以再运行几个 shell。想象一下登录、运行 X,然后在 X 中使用 bash shell 启动一些终端。这意味着你的登录 shell 启动了 X,它继承了你的登录 shell 的环境变量,它启动了你的终端,它启动了你的非登录 bash shell。您的环境变量在整个链中传递,因此您的非登录 shell 不再需要加载它们。由于这个确切原因,非登录 shell 只执行~/.bashrc,不执行/.profile~/.bash_profile,因此在其中定义仅适用于 bash的所有内容。那是函数、别名、仅限 bash 的变量,例如 HISTSIZE(这不是环境变量,不要导出它!)set 、带有and的shell 选项shopt等。例如,请参阅:我的.bashrc
  • 现在,作为 UNIX 特性的一部分,login-shell 不会执行~/.bashrc,而只会执行~/.profileor ~/.bash_profile,因此您应该从后者手动获取它。你会看到我在我的~/.profile也是这样做的:source ~/.bashrc
于 2009-05-24T06:22:37.773 回答
13

从 bash 手册页:

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

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

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

因此,如果您想为登录 shell 和交互式非登录 shell 获得相同的行为,您应该将所有命令放在.bashrcor.bash_profile中,然后将另一个文件放在第一个。

于 2009-05-24T02:46:23.080 回答
4

.bash_profile为“登录外壳”加载。我不确定在 OS X 上会是什么,但在 X11 或虚拟终端的 Linux 上。

.bashrc每次运行 Bash 时都会加载。每当您打开一个新的 Terminal.app 窗口时,您都应该在此处放置要加载的内容。

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

于 2009-05-24T02:42:07.783 回答