Linux 上的 .bashrc 和 .profile 有什么区别?

运行 Bash 的 Linux 机器在您登录以配置您的 shell 环境时读取某些文件。但是读取哪些文件以及何时读取可能会造成混淆,这使得很难知道是编辑 .bashrc 文件、.bash_profile 文件还是另一个配置文件。这是要知道的。
不同类型的外壳
启动 shell 时获得的环境由配置文件或配置文件 文件中的设置定义。这些包含确定文本颜色、命令提示符、别名以及在键入程序名称时搜索可执行文件的路径等信息。
这些设置存储在许多不同的文件(位于文件系统的不同位置)中。但是在我们开始查看启动 shell 时读取了哪些文件之前,我们需要弄清楚您使用的是什么类型的 shell。
登录 shell 是您登录的 shell。当您启动计算机并登录时,在您的图形桌面环境下有一个登录 shell。如果您通过 SSH 连接连接到另一台计算机,您也会登录到登录 shell。
打开终端窗口时获得的 shell 类型是非登录 shell。当您已经登录时,您无需进行身份验证即可启动 shell。登录和非登录 shell 是交互式 shell。您可以通过键入说明、按“Enter”键并阅读屏幕上的响应来使用它们。
也有非交互式外壳。这些是在执行脚本时启动的 shell 类型。该脚本在新的 shell 中启动。脚本顶部的 shebang #!/bin/bash
指示应使用哪个 shell。
#!/bin/bash
echo -e "Hello, World!\n"
该脚本将在非交互式 Bash shell 中运行。请注意,即使 shell 是非交互式的,脚本本身也可以。这个脚本打印到终端窗口,并且可以很容易地接受用户输入。
非交互式外壳
非交互式 shell 在启动时不会读取任何配置文件。它们确实继承了环境变量,但它们对别名一无所知,例如,它们是在命令行上还是在配置文件中定义的。
您可以通过查看作为命令行参数传递给它的选项来测试 shell 是否是交互式的。如果选项中有“i”,则 shell 是交互式的。 Bash 特殊参数 $-
包含当前 shell 的命令行参数。
[[ $- == *i* ]] && echo 'Interactive' || echo 'Non-interactive'

让我们创建一个名为 xc
的别名,意思是“猫”。我们还将检查我们是否设置了 PATH
变量。
alias xc=cat
echo $PATH

我们将尝试从这个小脚本中访问这两个。将此脚本复制到编辑器中并将其保存为“int.sh”。
#!/bin/bash
xc ~/text.dat
echo "Variable=$PATH"
我们需要使用 chmod
使脚本可执行。
chmod +x int.sh

让我们运行我们的脚本:
./int.sh

在它的非交互式 shell 中,我们的脚本不能使用别名,但可以使用环境变量。交互式 shell 在配置文件和配置文件的使用方面更有趣。
交互式登录外壳
有两种类型的交互式登录 shell。一种是让您登录计算机的外壳。在桌面上,这通常是桌面环境下的 shell。无论您使用的是窗口式还是平铺式桌面环境,都必须通过 Linux 系统对您进行身份验证并允许您登录。
在没有安装桌面环境的服务器上,您可以直接登录到交互式 shell。如果您退出桌面环境并访问终端,您可以在台式计算机上做同样的事情。在 GNOME 上,您可以使用 Ctrl+Alt+F3 组合键执行此操作。要返回 GNOME 会话,请按 Ctrl+Alt+F2 组合键。您通过 SSH 连接的 shell 也是一个登录 shell。
调用的配置文件和配置文件可以使用环境变量进行设置,因此它们可能因发行版而异。此外,并非所有文件都被每个发行版使用。在一般的 Bash 安装中,交互式登录 shell 读取“/etc/profile”文件。这包含系统范围的 shell 配置选项。如果它们存在,该文件还会读取“/etc/bash.bashrc”和“/usr/share/bash-completion/bash_completion”等文件。
Bash 然后查找“~/.bash_profile”文件。如果不存在,Bash 会查找“~/.bash_login”文件。如果该文件不存在,Bash 会尝试查找“.profile”文件。一旦找到并读取其中一个文件,Bash 就会停止搜索。所以在大多数情况下,“~/.profile”根本不可能被读取。
通常,你会在你的“~/.bash_profile”中找到类似这样的东西,或者,作为一种支持,在你的“~/.profile”文件中:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
这将检查活动 shell 是否为 Bash。如果是,它会搜索“~/.bashrc”文件并在找到时读取它。
交互式非登录外壳
Bash 交互式非登录 shell 读取“/etc/bash.bashrc”,然后读取“~/.bashrc”文件。这允许 Bash 具有系统范围和用户特定的设置。
编译 Bash 时可以使用编译标志更改此行为,但是遇到不获取和读取“/etc/bash.bashrc”文件的 Bash 版本是一种罕见且特殊的情况。
每次在桌面上打开终端窗口时,这两个文件都会用于配置该交互式非登录 shell 的环境。应用程序启动的 shell 也会发生同样的事情,例如 Geany IDE 中的终端窗口。
你应该把你的配置代码放在哪里?
放置您的个人自定义代码的最佳位置是在您的“~/.bashrc”文件中。您的别名和 shell 函数可以在“~/.bashrc”中定义,它们将被读入并在所有交互式 shell 中供您使用。
如果您的发行版没有在登录 shell 中读取您的“~/.bashrc”,而您希望这样做,请将此代码添加到您的“~/.bash_profile”文件中。
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
模块化是最好的
如果你有很多别名,或者你想在多台机器上使用相同的别名,最好将它们存储在它们自己的文件中,你的 shell 函数也是如此。您可以从“~/.bashrc”文件中调用这些文件。
在我们的测试计算机上,别名存储在一个名为“.bash_aliases”的文件中,一个名为“.bash_functions”的文件包含 shell 函数。
您可以从“~/.bashrc”文件中读取它们,如下所示:
# read in my aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# read in my shell functions
if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
fi
这使您可以轻松地在计算机之间轻松移动别名和函数。您只需将上面的行添加到每台计算机上的“~/.bashrc”文件中,并将包含您的别名和 shell 函数的文件复制到每台计算机上的主目录中。
这意味着您不需要将所有定义从一台计算机上的“~/.bashrc”复制到每台其他计算机上的“~/.bashrc”文件。这也比在计算机之间复制整个“~/.bashrc”文件要好,尤其是当它们在不同的发行版上运行 Bash 时。
总之
您真正需要了解的文件是:
- /etc/profile:系统范围的配置设置。由登录 shell 使用。
- ~/.bash_profile:用于保存个人用户的设置。由登录 shell 使用。
- ~/.bashrc:用于保存个人用户的设置。由交互式非登录 shell 使用。也可能从登录 shell 的“~/.bash_profile”或“~/.profile”文件中调用。
一种方便的方法是将您的个人设置放在“~/.bashrc”中,并确保您的“~./bash_profile”文件调用您的“~/.bashrc”文件。这意味着您的个人设置保存在一个文件中。您将在登录和非登录 shell 中获得一致的 shell 环境。将此与将别名和 shell 函数存储在非系统文件中相结合是一种简洁而强大的解决方案。