前言:当我们登陆bash shell时,会有欢迎文字、定义好的环境变量和命令别名,bash是如何帮我们设置好的?我们来探究一下。
10.4.1 路径与命令查找顺序
系统中有很多命令(如:ls),如果一个命令(如:ls)被执行,那么哪一个会被执行呢?
基本上,命令执行的顺序如下:
- 相对/绝对路径执行,如:/bin/ls、./ls
- 由alias找到该命令执行
- bash内置的命令
- 通过$PATH这个变量定义的路径
举个例子如下:
ls是我们经常使用的命令,但我们使用/bin/ls来执行,有思考过两者有什么不同吗?
可以自己试一试,你会发现,直接使用ls会有颜色区分文件和文件夹,但是/bin/ls却没有。
因为根据上面命令执行的顺序,直接执行/bin/ls就是执行ls命令,但执行ls后,会因为【alias ls='ls --color=auto'】而执行ls --color=auto这个命令。就这么简单。
那么我们如何知道一个命令(如:ls)执行时,系统的查找顺序呢?
答:使用type -a ls,如下图,先执行别名定义的命令,再执行bash内置命令,再执行绝对路径定义的命令。注意这里/usr/bin/ls是bash内置的命令哦。
[feng@njuhost ~]$ type -a ls
ls 是 `ls --color=auto' 的别名
ls 是 /usr/bin/ls
ls 是 /bin/ls
新手可略过以下内容:
关于经常出现的提示:未找到该命令
如果我们从源码(source code)编译安装一个软件,注意这个软件的命令都是在自己自定义的目录下的。思考上面的命令执行过程,我们是不是很容易就知道,想要运行相关的命令,是不是就需要在$PATH添加该安装路径呢?具体怎么做,请看接下来的分析。
其实我们很容易在网络上搜索到“如何更改linux环境变量”,但知道为什么这样做显然更重要。希望不要嫌弃我的啰嗦,因为这文章是写给我自己看的。哈哈。
10.4.2 bash的登录与欢迎信息
这里不是很重要,为了内容的完整性,还是补充了一下,大家可以略过。
bash也是有登录界面和欢迎信息的。我们在终端界面(tty1-tty6)登录的时候,会有几行提示的字符串,他们就是登录画面。
我这里默认是图形界面登录,我们切换非图形化界面看一下,怎么切换?这里介绍一个快捷键:
Ctrl+Alt+F1是图形化界面,Ctrl+ALT+F2/F3/F4/F5都为非图形化界面。
注意该种方法为暂时性地切换到非图形化界面。
切换到非图形界面,看,这就是欢迎信息啦:
那么问题来了,这些信息都写在哪个文件中呢?
答:在/etc/issue里。
看起来有点迷糊,其实\S \r \m就是类似于$PS1的变量,对照这上面,很容易就发现:
\S:操作系统的名称,这里是 CentOS Linux 7(Core)
\r:操作系统的版本,注意这里的版本号是要清楚含义的,可以自行百度了解
\m:硬件平台,这里就是x86_64,具体含义也自行百度哦。
更多的就不写啦,参考鸟叔的linux私房菜,想要修改登录界面的欢迎文字,就修改/etc/issue文件,你甚至可以在上面写一个大大的囧字,是不是很酷?
最后补充两个小知识点。当我们通过talnet远程登录程序来登录时,主机的登录画面显示的是/etc/issue.net而不是/etc/issue,另外我们可以修改/etc/motd,使得用户登录后显示一些信息。注意是登录后哦,/etc/issue显示的是非图形用户界面欢迎信息,此时还没有登录哦。
无非是将信息写在配置文件里了,了解哪些信息写在哪些配置文件中,这就是上面讲解的全部。不难,忘记了查一下就好了。平时也不用改这些东西。
10.4.3 bash的配置文件(这才是重点呀,好好看)
有没有奇怪,当我们一进入bash就已经取得一系列有用的变量了,比如$PATH,这些变量都定义在哪里呢?
答:系统中有一些环境配置文件存在,bash启动时会直接读取这些配置文件,来规划bahs的操作环境。这些配置文件分全局配置文件和个人配置文件,并且我们命令别名、自定义变量等在设置后要保存在这些配置文件中才能永久生效,否则注销bash之后就失效了。
知识点1:login与non-login shell
介绍bash配置文件之前,必须要明白几个概念,即login/non-login shell之间的区别,因为这两个取得bash的情况,读取的配置文件是不一样的。
login:取得bash需要完整的登录流程,比如从tty1-tty6登录时,都需要输入账号密码,那通过这种方式获得的bash就是login bash;
non-login bash:取得bash不需要完整登录流程。比如从X Window登录linux后,再启动终端;又或者在原来的bash下再执行bash命令。这些都不需要重新输入账号密码,它们都属于non-login bash。
一般来说,login bash只会读取以下两个配置文件:
- /etc/profile:系统整体的设置,不推荐修改;
- ~/.bash_profile或~/.bash_login或~/.profile:用户个人的配置,推荐改这里。
接下来介绍着两个文件。
知识点2:/etc/profile
这是bash的系统配置文件,其实就是一段脚本,利用用户标识符(UID)来决定很多重要的变量数据。文件设置的变量主要有:PATH MAIL USER HOSTNAME HISTSIZE umask
具体这些变量的含义等参考鸟叔的linux私房菜。其实就是一段脚本,学linxu一定要学会看、写脚本。
在/etc/profile这个脚本里,会调用外部的一些配置文件,这样使得/etc/profile本身很简洁,有哪些呢?
/etc/profile.d/*.sh
这个目录下的文件规定了bash操作界面的颜色、语系、命令别名等,如果需要设置一些用户共享的命令别名时,可以在这个目录下自行建立*.sh文件,将需要的数据写入即可。
/etc/locale.conf
这个文件由/etc/profile.d/lang.sh调用,来决定bash默认使用的语系。
/usr/share/bash-completion/completions/*
【tab】能够进行命令、文件名补齐,还能够进行参数补齐,就是从这个目录中找到的命令处理的,这个目录下的内容都是/etc/profile.d/bash_completion.sh这个文件加载的。
ps:这里我也没有深究,遇到再补充。
总之,bash的login shell读取的环境配置文件就是/etc/profile,但是该文件又调用了其他的配置文件,所以写的很简洁。这是linux设计的一个哲学,这种设计很多很多。
知识点3:~/.bash_profile
bash读完了/etc/profile之后还会读取~/.bash_profile文件,前者是系统整体环境配置文件,后者是用户个人环境配置文件。
因为bash的历史遗留问题,可能还会有~/.bash_login和~/.profile,本质是一样的,bash的login shell只会读取其中一个。这是为了照顾从其他shell转过来的用户而设置的。
让我们看一下~/.bash_profile里的内容:
[root@njuhost ~]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
先看后面简单的,将$HOME/bin添加进$PATH变量中,这样$HOME/bin也称为了执行文件路径。也就是说,我们将自己的执行文件放在家目录下的~/bin/文件夹下,就可以直接执行文件而不需要使用绝对路径了。很有意思。
接下来看上面的脚本,其实也很简单,判断家目录下的~/.bashrc是否存在,如果存在就读入~/bashrc的设置。也就是说~/.bash_profile还会读取~/.bashrc设置。
所以整个login shell的配置文件读取流程如下图:
上面的是主线流程,下面的是调用的配置文件。显然我们的偏好设置应该写在~/.bashrc里面。
注意到现在我们都是login shell哦。
知识点4:source
因为/etc/profile和~/.bash_profile都是在取得login shell的时候才会读取的配置文件,所以如果我们将自己的偏好设置写入上述文件之后,通常需要注销再登录,设置才会生效。
那么能不能直接读取配置文件而不用注销登录呢?可以使用source命令。
直接举个例子。我修改了~/.bashrc文件,立刻执行source ~/.bashrc命令,就能将刚刚设置的内容读入目前的环境中。
知识点5:~/.bashrc
上面我们讲的都是login shell,加下来讲一讲non-login shell的环境配置文件。
很简单,当我们取得non-login shell时,bash只会读取~/.bashrc而已。
~/.bashrc会调用/etc/bashrc,会完成一系列工作,这里就不细讲了,感兴趣的朋友可以去看一看。
知识点6:其他的配置文件
事实上还会有一些其他的配置文件可能影响bash操作的,简单介绍如下:
/etc/man_db.conf:规定了使用man时,去哪里寻找数据;
~/.bash_history:历史命令的记录;
~/.bash_logout:注销bash系统会帮我们完成什么任务。
10.4.4 终端的环境设置:stty、set
一般不需要更改,暂略。
10.4.5 通配符和特殊符号
bash环境中有一些常用的通配符和特殊符号。具体参见书本《鸟叔的linux私房菜》p344-p345
10.4.6 参考或其他帮助文档
鸟叔的linux私房菜