[Shell翻译]关于macOS上的bash_profile和bashrc

627 阅读3分钟

本文由 简悦SimpRead 转码, 原文地址 scriptingosx.com

注意:bash_profile与配置文件完全不同。了解更多关于Configuratio......

注意: bash_profile与配置文件完全不同。在我的书中了解更多关于配置文件的信息。'Property Lists, Preferences and Profiles for Apple Administrators'

你可以在我的书中了解更多关于在macOS上使用终端和外壳的信息。"macOS终端和shell" - 谢谢你!

在这个关于macOS终端的自发系列中,我经常提到在你的bash_profilebashrc中添加一些东西作为aliasfunction。很明显,你可能会想:我怎么做呢?我应该使用哪个文件呢?

为什么?

当你经常使用命令行和bashshell工作时,你会想要定制环境。这可能意味着改变环境变量,比如shell寻找命令的位置或提示符的样子,或者添加自定义命令。

例如,macOS将PATH环境变量设置为/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin。这是一个目录列表(用冒号":"分隔),系统会依次搜索这些命令。我喜欢在我的主目录中添加一个文件夹~/bin到这个列表中,这样我就可以执行某些工具而不需要输入完整的路径。(例如,munkipkgquickpkgssh-installer)。

bash中,你可以在现有的PATH上添加这样的内容。

export PATH="$PATH:~/bin"

你可以在每次打开一个新的终端窗口(即shell)时输入这个命令,或者你可以配置你的shell来自动完成这个任务。

根据你使用的shell和你启动shell的方式,那么某些脚本文件将被执行,允许你设置这些自定义的功能。

本文将讨论在macOS上定制bash的问题。其他shell和其他操作系统可能有其他文件或规则。

那么,哪个文件呢?

由于bash的丰富和悠久的历史,你应该把你的配置放在哪个文件中,答案是令人惊讶的混乱。

bashshell启动时,有(主要)两个用户级别的文件,bash可以运行。~/.bash_profile~/.bashrc

这两个文件都在你的主目录~/的第一层。由于文件名以". "开头,Finder和普通的ls不会显示它们。你需要使用ls -a来查看它们是否存在。在这里阅读更多关于不可见和隐藏的文件。

通常的惯例是,.bash_profile将在登录的shell中执行,即在开始时用用户名和密码登录的交互式shell。当你ssh进入一个远程主机时,它会要求你提供用户名和密码(或其他认证)来登录,所以它是一个登录shell。

当你打开一个终端程序时,它不会要求你登录。你将只是得到一个命令提示。在其他版本的Unix或Linux中,这不会运行.bash_profile,而是一个不同的文件.bashrc。其基本思想是,.bash_profile应该只在你登录时运行一次,而.bashrc应该在每个新的交互式外壳中运行。

然而,macOS上的Terminal.app并没有遵循这个惯例。当Terminal.app打开一个新窗口时,它将运行.bash_profile。而不是像熟悉其他Unix系统的用户所期望的那样,运行".bashrc"。

注意:作为Xquartz的一部分安装的Xterm应用程序在打开新窗口时运行.bashrc,而不是.bash_profile。macOS上的其他第三方终端应用程序可能遵循Terminal.app设定的先例,也可能不遵循。

这一切都非常令人困惑。

主要有两种方法。

  • 当你主要或完全生活在macOS和Terminal.app上时,你可以创建一个.bash_profile,忽略所有的特殊情况并感到高兴。
  • 如果你想有一个对其他终端应用更有弹性的方法,并且可能在Unix/Linux平台上工作(至少部分),把你的配置代码放在.bashrc中,并从.bash_profile中获得.bashrc的源代码,在.bash_profile中使用以下代码。
if [ -r ~/.bashrc ]; then
   source ~/.bashrc
fi

if [ -r ... ]测试一个文件是否存在和可读,source命令读取并评估一个文件的位置。有时你会看到

[ -r ~/.bashrc ] && . ~/.bashrc

(注意空格)这是做同样事情的一个更短的方法。

由于这两个文件都能极大地改变你的环境,你要限制只有你自己才能访问。

$ chmod 700 ~/.bash_profile
$ chmod 700 ~/.bashrc

这很让人困惑。就这些了吗?

不,还有更多的文件在创建shell时可能被执行。

bash找不到.bash_profile时,它将寻找.bash_login,如果它不存在,则寻找.profile。如果.bash_profile存在,那么后面的文件将被忽略。(尽管你可以在你的.bash_profilesource它们)

还有一个文件/etc/profile是为交互式登录外壳(和Terminal.app)运行的。它提供了一个中心位置来配置系统中所有用户的shells。在macOS上/etc/profilepath_helper工具设置默认的PATH,然后“应用/etc/bashrc,(你猜到了)这将是所有用户的中心文件,为非登录的交互式外壳执行。对于macOS的Terminal.app,/etc/bashrc设置了默认的提示符,然后它的来源是/etc/bashrc_Apple_Terminal,它设置了跨登录的会话持久性。

因此,在macOS Terminal.app中,在你看到提示符之前,这些脚本将被运行。

  • /etc/profile
    • /etc/bashrc.
      • /etc/bashrc_Apple_Terminal
        • 如果它存在:~/.bash_profile
        • ~/.bash_profile不存在时,~/.bash_login也存在。
        • ~/.bash_profile~/.bash_login都不存在时,~/.profile就会出现。
  • ~/bash_profile可以选择为~/.bashrc提供源码。

还有一个文件~/.inputrc,你可以在这里设置某些命令行输入选项。一个常见的例子是启用不区分大小写的Tab补全。你可以找到这里有更多的选项列表

最后,还有~/.bash_logout,当shell退出或关闭时运行。

好了,我有了这个文件,现在怎么办?

无论你选择哪种文件,(我选择了第一种方案,把所有东西都放在.bash_profile中)现在你要把东西放进去。

从技术上讲,这是一个脚本,所以你可以做任何你能在bash中编码的事情。然而,通常.bash_profile.bashrc的内容属于以下三类之一。

我将在下一篇中分别展示一些例子!


www.deepl.com 翻译