.bashrc,.bash_profile和.environment之间有什么区别?
-
03-07-2019 - |
题
我已经使用了多年来基于* 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操作系统中工作时,这似乎是一团糟。