命令行配置文件

在说具体的配置方式之前,我们需要首先梳理清除几个概念。这有助于我们明白自己在做什么,以及如何把经验平移到其他方面。

和命令行相关的有几个概念:terminal(终端)、shell(解释器);interactive 和 non-interactive、login 和 non-login。

我们一一来解释和说明它们各自的用途和含义。

概念解释

terminal 和 shell 的关系如下图所示

命令行配置文件_第1张图片

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 环境)

这两种环境的主要不同点有两个:

  1. 加载的配置文件不同
  2. non-login 因为没有登录过程,因此没有用户环境的环境变量

配置文件(以 bash 为例)

shell 初始化时,加载哪些配置文件只和状态是 login 还是 non-login 有关。

login 的情况下,依次会读取以下几个配置文件:/etc/profile~/.bash_profile~/.bash_login~/.profile。后面三个用户目录下的配置文件,会按照优先级顺序读取一个。即,当 ~/.bash_profile 存在时,就不会读取后面两个。

命令行配置文件_第2张图片

non-login 的情况就比较简单:/etc/bash.bashrc > .bashrc

因此,有个小技巧。一般会把 alias 等定义放在 bashrc 中。

补充

在不同系统中 bashrc 的名称可能会不同,但是作用是一样的。比如在 Debian 高版本系统中,会使用 bash.bashrc 名称。

history

除了上面提到的配置文件外,还有一个文件需要注意,那就是 .bash_history。这个文件会记录用户在控制台输入的命令,所以用户可以通过 键快速输入使用过的命令。 默认会记录 100 条历史记录。

HISTSIZE 环境变量可以控制可以保存的历史记录数量。HISTFILE 可以指定历史记录保存文件的路径,默认是 ~/.bash_history

你可能感兴趣的:(脚本,shell,bash,login,non-login,interactive,bashrc)