本文由 简悦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
。很明显,你可能会想:我怎么做呢?我应该使用哪个文件呢?
为什么?
当你经常使用命令行和bash
shell工作时,你会想要定制环境。这可能意味着改变环境变量,比如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
的丰富和悠久的历史,你应该把你的配置放在哪个文件中,答案是令人惊讶的混乱。
当bash
shell启动时,有(主要)两个用户级别的文件,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
的内容属于以下三类之一。
我将在下一篇中分别展示一些例子!