一、bash类型
当我们每次进入Linux系统时,总能使用到例如ll
之类的一些命令,这些命令并非bin目录下的可执行文件,而是Linux发行版为我们预置的alias。那么Linux发行版究竟是什么时候又是如何为我们配置的这些东西呢?想要直到这个问题,需要先来了解一下bash的几种类型
- 登陆式bash:所谓的登录式bash就是当用户以登录的方式启动的bash,例如
ssh
远程登录,在命令行输入bash -l
命令启动一个登录式child bash或者进入一个docker容器docker exec -it ${container_id} bash -l
,注:这个登录的用户是dockerfile中定义的USER,如果没定义默认是root - 非登录式bash:与第一种相反,出现的场景有:在命令行输入
bash
命令启动一个非登陆式child bash或者进入容器docker exec -it ${container_id} bash
- 非交互式bash:这种出现的情况只有一种那就是执行shell脚本。
二、bash启动文件
针对不同的bash类型,Linux会通过不同的配置文件对其进行启动配置,并且这些文件名称都是固定的,Linux会默认去执行这些文件。
登录式bash首先会读取全局配置文件/etc/profile,然后会依次寻找几个文件$HOME/.bash_profile, $HOME/.bash_login, $HOME/.profile,找到第一个文件就会执行,余下的则会被忽略。全局配置文件不论你是哪个用户登录都会执行,所以很多常用的别名都会在此配置,家目录下的配置文件更加偏向用户个人的习惯。
非登录式bash只会执行家目录下的.bashrc,之所以很多人觉得这两类bash没有区别是因为该文件通常会去调用执行登录式bash的配置文件。
非交互式bash即bash脚本的执行并不会读取任何配置文件,但是由于它是一个child bash所以它会继承父bash的全局环境变量(通过export配置的),但是alias是继承不了的。
/etc/profile | ~/.bash_profile | ~/.bash_login | ~/.profile | ~/.bashrc | |
---|---|---|---|---|---|
登录式bash | √ | √ | √(当前一个配置文件不存在时) | √(当前两个配置文件不存在时) | × |
非登录式bash | × | × | × | × | √ |
非交互式bash | × | × | × | × | × |
三、自定义命令提示符
我们登陆不同发行版的Linux电脑会发现它们默认的命令提示符都不太相同。那么这个究竟是在哪里配置的呢?其实这个配置是通过一个叫做PS1的环境变量设置的。然后最终的显示是由我们的终端读取该变量进行渲染的。
下面先来看看我的配置,然后看下它是如何在终端渲染的:
export PS1='\[\e[36;1m\][\u@\h]\[\e[0m\] \W\$ '
显示效果:
这个PS1环境变量配置我是设置在$HOME/.bash_profile中,当然如果你想让所有的用户都实现这个效果也可以设置在全局启动文件(/etc/profile)中,不过一般这个是用户个人习惯,最好不要污染全局文件。
这个配置的含义是:\[\e[36;1m\]
代表后面文本是青蓝色(36)并且加粗(1m)显示,[\u@\h]
代表了某个用户在哪个主机(也就是[hch@instance-mfw2qss3]),\[\e[0m\]
代表了后面的文本没有字体颜色和特效。\W
代表了当前所在路径的最后一个目录名
bash支持的颜色特效如下表所示,使用方式为\[\e[字体颜色;背景颜色;字体特效m\]
,这三者的顺序不做强制要求,不填的话就按照默认效果显示。
附1:字体颜色码
字体颜色码 | 对应颜色 |
---|---|
30 | 黑色字体 |
31 | 红色字体 |
32 | 绿色字体 |
33 | 黄色字体 |
34 | 蓝色字体 |
35 | 洋红字体 |
36 | 青色字体 |
37 | 白色字体 |
附2:背景颜色码
背景颜色码 | 对应颜色 |
---|---|
40 | 黑色背景 |
41 | 红色背景 |
42 | 绿色背景 |
43 | 黄色背景 |
44 | 蓝色背景 |
45 | 洋红背景 |
46 | 青色背景 |
47 | 白色背景 |
附3:字体特效码
字体特效码 | 对应特效 |
---|---|
0 | 无特效 |
1 | 加粗 |
4 | 下划线 |
5 | 闪烁 |
7 | 反白显示 |
8 | 不可见 |
附4:信息参数码
信息参数码 | 含义 |
---|---|
\u | 当前用户,和whoami命令等价 |
\h | 主机名,和hostname命令等价 |
\w | 当前目录完整的路径名,和pwd命令等价 |
\W | 当前目录 |
\d | 当前日期,周月日格式例如 “Tue May 26” |
\t | 24小时制的当前时间 |
\T | 12小时制的当前时间 |
\@ | 带am或pm的12小时制当前时间 |
\j | 在此shell中通过按 ^Z挂起的进程数 |
\l | 此shell的终端设备名 (如"ttyp4") |
\s | 当前使用的shell名,和echo $0等价 |
\n | 换行符 |
\r | 回车符 |
\# | 井号,用于提示符 |
\$ | 美元符号,用于提示符 |