.bash_profile 和 .bash_login 有什么区别?

sta*_*low 11 bash

我一直在研究 bash 的工作原理,到目前为止我已经了解了以下内容:

启动登录 shell 时,将执行以下存在的第一个文件:

~/.bash_profile, ~/.bash_login,~/.profile

当启动交互式的非登录 shell(或子 shell)时,该~/.bashrc文件将被执行。

此外,.profile 还可以由 sh 等其他 shell 执行。我现在的问题是,拥有 .bash_profile 和 .bash_login 有什么意义?它们都执行相同的功能,并且与 .profile 不同,.bash_profile 和 .bash_login 都只能由 bash 读取。我知道它们之间的唯一区别是,如果 .bash_profile 不存在,则 .bash_login 会被执行。那么为什么它会在那里呢?

Kus*_*nda 9

shellcsh从中bash获得了一些功能,用作.login启动登录 shell 时运行的 shell 启动文件的名称,就像ksh另一个对bashshell 影响很大的 shell 一样,用作.profile登录 shell 的启动文件。

因此,从shell 的文件.bash_profile中借用其名称,同时从shell 的文件中借用其名称。ksh.profile.bash_logincsh.login

用户使用.bash_profile.bash_login依赖于他们要迁移到的其他 shell 系列(ksh类似 shell 或csh类似 shell)bash

显然,如今,许多 Linux 用户从未使用过除 之外的其他 shell bash,因此他们使用的任何文件名很可能取决于系统管理员、老师的偏好,或者可能是随机的。

如果 和~/.bash_profile~/.bash_login存在,则该~/.bash_login文件将被忽略。


Ell*_*iew 2

使用可选脚本名称 而非 的一个优点~/.bash_login~/.profile~/.bash_logout如果您决定使用注销脚本,则有一个并行名称。

因此,如果您运行的是 Bash,而不是 Bourne,这会简化配置名称集的复杂性:

/etc/profile         # system login       script
~/.bash_profile      # user   login       script
~/.bash_logout       # user   logout      script

/etc/bash.bashrc     # system interactive script
       ~/.bashrc     # user   interactive script
Run Code Online (Sandbox Code Playgroud)

对此:

/etc/profile         # system login       script
~/.bash_login        # user   login       script  <--sisters +
~/.bash_logout       # user   logout      script  <----------+

/etc/bash.bashrc     # system interactive script
       ~/.bashrc     # user   interactive script
Run Code Online (Sandbox Code Playgroud)

但是,如果您不打算使用注销脚本,那么其他方法对您来说可能更简单:

   /etc/profile      # system login       script
~/.bash_profile      # user   login       script

/etc/bash.bashrc     # system interactive script
       ~/.bashrc     # user   interactive script
Run Code Online (Sandbox Code Playgroud)

太糟糕了,配置名称中没有更多的名称对称性......

但是您可以使用这些符号链接使这变得更好:

/etc/bash   -->    /etc/profile   # system login       script
  ~/.bash   --> ~/.bash_profile   # user   login       script

/etc/bashrc --> /etc/bash.bashrc  # system interactive script
  ~/.bashrc                       # user   interactive script
Run Code Online (Sandbox Code Playgroud)

非破坏性地创建:

sudo ln -sT    /etc/profile  /etc/bash
     ln -sT ~/.bash_profile    ~/.bash

sudo ln -sT /etc/bash.bashrc /etc/bashrc
#                              ~/.bashrc  (don't change)
Run Code Online (Sandbox Code Playgroud)

或者,您可以更积极地扭转这一局面,将文件移动到新名称,然后反向链接它们:

sudo mv -f    /etc/profile       /etc/bash          && \
sudo ln -sT   /etc/bash          /etc/profile

sudo mv -f    /etc/bash.bashrc   /etc/bashrc        && \
sudo ln -sT   /etc/bashrc        /etc/bash.bashrc

     mv -f    ~/.bash_profile    ~/.bash            && \
     ln -sT   ~/.bash            ~/.bash_profile

#             ~/.bashrc              (don't change)
Run Code Online (Sandbox Code Playgroud)

不管怎样,现在你有了这些更统一的配置文件名,当你从链接中忘记它们时很容易找到它们:

/etc/bash    # system login       config script
  ~/.bash    # user   login       config script

/etc/bashrc  # system interactive config script
  ~/.bashrc  # user   interactive config script
Run Code Online (Sandbox Code Playgroud)

(我不使用注销脚本,但它可能会被命名为:/etc/bash.logout。)