我已经使用了多年来基于* nix的系统,看起来我使用的Bash的每种风格都有不同的算法来决定运行哪些启动脚本。出于设置环境变量和别名以及打印启动消息(例如MOTD)等任务的目的,哪个启动脚本是执行这些操作的适当位置?

将内容放入 .bashrc .bash_profile .environment 之间有什么区别?我还看过其他文件,例如 .login .bash_login .profile ;这些是否相关?在物理登录,通过ssh远程登录以及打开新的终端窗口时,运行哪些不同?跨平台(包括Mac OS X(及其Terminal.app)和Cygwin Bash)是否存在显着差异?

有帮助吗?

解决方案

与shell配置文件的主要区别在于,有些只能通过“login”来读取。 shell(例如,当您从其他主机登录,或在本地unix机器的文本控制台登录时)。这些是所谓的 .login .profile .zlogin (取决于你正在使用的shell)。

然后你有“交互式”阅读的配置文件。 shell(例如,连接到终端的那些(或者,例如,在窗口系统下运行的终端仿真器的伪终端)。这些是名称如 .bashrc ,<代码> .tcshrc , .zshrc 等。

bash 使得 .bashrc 仅由交互式非登录的shell读取 ,所以你会发现大多数人最终都会告诉他们的 .bash_profile 还要用

之类的东西来读取 .bashrc

[[-r~ / .bashrc]]&amp;&amp; 。的〜/ .bashrc

其他shell的行为方式不同 - 例如, zsh .zshrc 总是为交互式shell读取,无论是否为登录。

bash的手册页介绍了读取每个文件的环境。是的,机器之间的行为通常是一致的。

.profile 只是 / bin / sh 最初使用的登录脚本文件名。 bash ,通常与 / bin / sh 向后兼容,如果存在 .profile ,将会读取 .profile

其他提示

这很简单。它在 man bash 中解释:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

登录shell是您登录时读取的shell(例如,仅在启动xterm时不会执行它们)。还有其他登录方式。例如,使用X显示管理器。这些还有其他方法可以在登录时读取和导出环境变量。

另请阅读手册中的 INVOCATION 章节。它说&quot;以下段落描述了bash如何执行其启动文件。“,我认为这是一个现场点:)它解释了什么是”交互式“。贝壳也是。

Bash不了解 .environment 。我怀疑这是你的发行版的一个文件,用于设置独立于你驱动的shell的环境变量。

传统上,Bourne Shell使用〜/ .profile ,并且Bash可能支持将其作为遗留度量。同样,C Shell使用了〜/ .login 〜/ .cshrc - 我不确定Bash是否会使用它们。

〜/ .bash_profile 将在登录时使用一次。每次启动shell时都会读取〜/ .bashrc 脚本。这类似于C Shell的 /。cshrc

一个结果是〜/ .bashrc 中的内容应该尽可能轻量级(最小),以减少启动非登录shell时的开销。

我相信〜/ .environment 文件是Korn Shell的兼容性文件。

我找到了有关.bashrc和.bash_profile的信息此处总结一下:

  当你执行

.bash_profile   登录。你放入的东西可能有   你的PATH和其他重要的   环境变量。

     

.bashrc用于非登录shell。   我不确定这意味着什么。我知道   那个RedHat   每次开始时执行它   另一个shell(su给这个用户或者   只是再次调用bash)你可能会   想把别名放在那里,但又来了   我不确定这意味着什么。一世   简单地忽略它。

     

.profile相当于   .bash_profile为root。我认为   将名称更改为让其他名称   shell(csh,sh,tcsh)也使用它。   (你不需要一个用户)

     

还有.bash_logout   执行,是的好猜...退出。   你可能想要停止deamons甚至   做一点管家。您可以   还添加“清除”如果你愿意的话   当你退出时清除屏幕。

此外,还有对每个配置文件的完整跟进这里

这些甚至可能是依赖于发行版的,并非所有发行版都选择与它们进行每次配置,而有些发行版甚至更多。但是当它们具有相同的名称时,它们通常会包含相同的内容。

根据 Josh Staiger ,Mac OS X的Terminal.app实际上是默认情况下,为每个新的终端窗口运行一个登录shell而不是非登录shell,调用.bash_profile而不是.bashrc。

他建议:

  

大多数情况下,您不想维护两个单独的配置文件   用于登录和非登录shell&#8212;当你设置PATH时,你想要它   适用于两者。您可以通过从您的.bashrc获取.bashrc来解决此问题   .bash_profile文件,然后将PATH和常用设置放在.bashrc中。

     

为此,请将以下行添加到.bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi
     

现在当你登录你的   来自控制台.bashrc的机器将被调用。

一个好看的地方是bash的手册页。 这里是一个在线版本。寻找“INVOCATION”部分。

我使用过Debian-family发行版,它似乎执行 .profile ,但不是 .bash_profile , 而RHEL派生词在 .profile 之前执行 .bash_profile

当你必须设置环境变量以在任何Linux操作系统中工作时,这似乎是一团糟。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top