当我们每次进入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类型,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\],这三者的顺序不做强制要求,不填的话就按照默认效果显示。