【问题标题】:About .bash_profile, .bashrc, and where should alias be written in? [duplicate]关于.bash_profile,.bashrc,别名应该写在哪里? [复制]
【发布时间】:2010-10-28 12:37:12
【问题描述】:

可能重复: 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。

【问题讨论】:

  • 哦,这太愚蠢了。这个问题已经存在了将近两年。它不是完全重复的,因为它要求提供规范性建议(应该做什么)。

标签: bash shell environment


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    loginnon-login shell 分开的原因是因为每次启动 Bash 的新副本时都会重新加载 .bashrc 文件。 .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 中键入命令一样。

    【讨论】:

    • 应该是反过来:.bash_profilesources.bashrc,而且你第一次登录后使用的是非登录shell。
    • 再读一遍我说的。
    • 很好的解释。只是想知道“bash 在启动时加载你的 .bashrc”究竟是什么意思。你是指机器什么时候启动还是终端什么时候启动?
    • 每当 bash 进程启动时。假设我这样做: $ bash $ bash $ bash 然后我有四个 bash 进程正在运行。 .bashrc 由每个进程加载。
    • @CharlieMartin 我还想指出,如果您打开另一个 shell 并使用 login 以其他用户身份登录 - 使用命令 source ~/.profilesource ~/.bashrc 将不会来自新登录用户的主文件夹,但您登录计算机的用户的主文件夹。也许除了使用~/ 之外还有另一种解决方案
    【解决方案3】:

    来自 bash 手册页:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      总结:

      • 您只需登录一次,即读取并执行~/.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 特性的一部分,登录 shell 不会执行 ~/.bashrc,而只会执行 ~/.profile~/.bash_profile,因此您应该从后者手动获取它。你会在我的~/.profile 中看到我这样做:source ~/.bashrc

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 2013-07-31
      • 2013-04-01
      • 2021-06-17
      • 2010-09-29
      相关资源
      最近更新 更多