在说具体的配置方式之前,我们需要首先梳理清除几个概念。这有助于我们明白自己在做什么,以及如何把经验平移到其他方面。
和命令行相关的有几个概念:terminal(终端)、shell(解释器);interactive 和 non-interactive、login 和 non-login。
我们一一来解释和说明它们各自的用途和含义。
概念解释
terminal 和 shell 的关系如下图所示
terminal
terminal 是用户直接能接触到的软件。它提供了 shell 执行的环境,和交互(如:输入、输出的显示等)等能力,让用户可以方便的使用命令行。
terminal 会把用户的输入传给 shell,把 shell 的输出显示给用户。
除了系统内置的 terminal 外,还有 iTerm2 等。除此之外还有 zsh、fish、powershell 等。
shell
shell 简单说就是一个解释器。它定义了一些语法规则,然后把输入的语句转化为对操作系统功能的调用,然后把调用过程的输出和结果返回。
也就是说 shell 做了两件事:定义语法规则;解释执行按照语法规则写成的语句。
最常见的 shell 是 bash。除此之外还有 sh、zsh、csh 等。常用的指令在不同的 shell 之间通用,但又拓展了不同的特性。比如,zsh 允许用户在配置文件里定义函数,但 bash 不支持。
通过 echo $SHELL
可以查看当前使用的 shell。
interactive 和 non-interactive
交互就是不同类型的个体之间有通信交流,一起完成一件事。在命令行里就是,你给终端一个语句,他执行,然后给你一个反馈,然后你再给一个语句,如此循环直到结束。
非交互式最常见的场景就是执行 script 脚本,中间完全自动,不会依赖外部输入。
login 和 non-login
这两个最大的区别就是获取 shell 时,是否有登录鉴权过程。
常见的获取 login 这种 shell 的场景有
- 远程 SSH 登录
- 本地 SSH 登录本机
- 获取 shell 时使用
--login
参数
常见的 non-login shell 的场景是:
- 图形化界面登录系统后,点击打开的 terminal 默认使用 non-login
- 在 terminal 中执行
bash
命令后,新创建的 shell 环境是 non-login - 使用
su
命令切换用户后的环境,默认是 non-login(su --login [username]
使用的是 login 环境)
这两种环境的主要不同点有两个:
- 加载的配置文件不同
- non-login 因为没有登录过程,因此没有用户环境的环境变量
配置文件(以 bash 为例)
shell 初始化时,加载哪些配置文件只和状态是 login 还是 non-login 有关。
login 的情况下,依次会读取以下几个配置文件:/etc/profile
、~/.bash_profile
、~/.bash_login
、~/.profile
。后面三个用户目录下的配置文件,会按照优先级顺序读取一个。即,当 ~/.bash_profile
存在时,就不会读取后面两个。
non-login 的情况就比较简单:/etc/bash.bashrc
> .bashrc
。
因此,有个小技巧。一般会把 alias
等定义放在 bashrc
中。
补充
在不同系统中 bashrc
的名称可能会不同,但是作用是一样的。比如在 Debian 高版本系统中,会使用 bash.bashrc
名称。
history
除了上面提到的配置文件外,还有一个文件需要注意,那就是 .bash_history
。这个文件会记录用户在控制台输入的命令,所以用户可以通过↑
↓
←
→
键快速输入使用过的命令。 默认会记录 100 条历史记录。
HISTSIZE
环境变量可以控制可以保存的历史记录数量。HISTFILE
可以指定历史记录保存文件的路径,默认是 ~/.bash_history
。