本文由 简悦SimpRead 转码, 原文地址 scriptingosx.com
注意:bash_profile与配置文件完全不同。了解更多关于Configuratio......
注意: bash_profile与配置文件完全不同。在我的书中了解更多关于配置文件的信息。'Property Lists, Preferences and Profiles for Apple Administrators'
你可以在我的书中了解更多关于在macOS上使用终端和外壳的信息。"macOS终端和shell" - 谢谢你!
在这个关于macOS终端的自发系列中,我经常提到在你的bash_profile或bashrc中添加一些东西作为alias或function。很明显,你可能会想:我怎么做呢?我应该使用哪个文件呢?
为什么?
当你经常使用命令行和bashshell工作时,你会想要定制环境。这可能意味着改变环境变量,比如shell寻找命令的位置或提示符的样子,或者添加自定义命令。
例如,macOS将PATH环境变量设置为/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin。这是一个目录列表(用冒号":"分隔),系统会依次搜索这些命令。我喜欢在我的主目录中添加一个文件夹~/bin到这个列表中,这样我就可以执行某些工具而不需要输入完整的路径。(例如,munkipkg,quickpkg和ssh-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_profile中source它们)
还有一个文件/etc/profile是为交互式登录外壳(和Terminal.app)运行的。它提供了一个中心位置来配置系统中所有用户的shells。在macOS上/etc/profile用path_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的内容属于以下三类之一。
我将在下一篇中分别展示一些例子!