4FHS和bash
1FHS的基本概念
FHS文件系统层级结构标准,我们为什么一定要尊从这个标准,为啥windows没这个标准?因为windows有注册列表这个东西,可以帮助windows定位程序的位置。而linux没有注册列表,那我们怎么找到我们的运行程序。嗯,我们定义一个标准的安装程序的目录,程序的各个部件的安放位置。
怎么定义呢?
/boot 安放引导程序
/lib 安放32位的库文件
/lib64 安装64位的库文件
/bin 可执行文件
/etc 配置文件的目录
/dev 设备文件的位置
/usr 一些大的程序安放位置
/usr/local 一般用来放编译程序
/usr/bin 可执行文件
/usr/share/man man文档
/var 系统运行的临时文件和日志和部分程序数据存放位置
/srv 服务程序的数据文件
/proc 伪文件,内存把可配置的部分模拟成文件
/sys 新的内存模拟文件
/tmp 垃圾文件
这比windows那种安放文件更适合系统管理员,这样文件的权限更好管理,因为类似的文件在同一目录下,最大程度把同种属性的文件放在了同一目录下了,更方便权限限定。
Note:微服务盛行的今天,个人感觉windows管理文件的方式更加适合服务器,因为每个服务器只运行一个服务,这个服我们更有可能编译安装软件,最大程度压榨计算机的计算资源,编译安装就有一个特点了,程序所需要的文件都会在同一目录下。
2bash与人机交互特性
1)bash使用命令的流程
在命令行里我敲一个命令,为什么会那么快回复我们结果,bash是怎么找到命令的?我介绍一下bash查找到命令的过程。
首先我们要明白一个道理,bash运行时他已经全部了内存中。这时,当bash接受到一个命令,bash就像一个人一样,首先看自己人有没有符合条件的查看自己中内嵌的函数,有就调用没有再去找那些非自己人的人;这时外部命令开始竞争这个位置,人那么多我们选哪一个,当然选和我们关系比较近的,好,我们在$PATH定义和我亲疏关系,不在亲疏关系中的人,坚决不能用,万一老宋来到我们身边多么危险。
亲疏关系一般都分为好几层吧,嗯,我们定义了$PATH多个选人路径,执行如下命令查看$PATH的调用顺序,优先级是从前到后调用:
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
还有alias,这个更了不得了,就像党校校长一定是下一代领导人。它的优先级比内部命令还要高。总结一下,命令执行时的顺序是alias->内建命令->外部命令。
2)Hash命令路径缓存
富二代总是围绕在我们周围,官二代更是NB,人家根本不和在等级中,天生清华北大已经为他们留下了位置,既然我们不可能是二代了,那我们就开宗立派成为一代目。Linux也是这样,linux中有一个hash机制,当我们执行过一个命令后,bash就会把我们执行程序的路径保存下来。
执行bash命令查看已经缓存的命令:
# hash
hits command
1 /usr/bin/tty
1 /usr/bin/abrt-cli
1 /usr/bin/date
1 /usr/bin/mv
1 /usr/bin/mkdir
这个命令的执行结果每个人可能不一样,以上是我执行hash命令的结果。既然是缓存,那么就会有问题,为啥?因为缓解矛盾后矛盾还是存在,只是被包上糖衣,糖吃到一半一定会划到嘴。
当我执行的命令变了位置,而缓存没有变,就会找不到命令,怎么办,凉拌。自己手动删除缓存。
hash -d Name 删除一条缓存
hash -r Name 清除缓存
Note:这里的Name是命令的别名.
3)history命令历史
现在很多浏览器都会记录浏览记录,还有更过分的,可以联网查找自己更早的历史记录,这就很可怕了,我们的行为都被记录了,我们还删除不了。Google的人工智能就用这些数据训练机器,现在走在人工智能最前列的不是搞了alphago的google,而是ibm,当alphago还在努力赚足眼球的时候,ibm的沃森已经帮腾讯赚了好几笔钱了,每年世界杯腾讯都有沃森对每场比赛进行分析,合理的投放广告,会员收费。NBA大家都很熟悉吧,有家机构开始使用沃森安排每个球员每天的训练量。举个例子詹姆斯的一天,詹姆斯今天需要回家看望奶奶,沃森就会帮詹姆斯买的飞机和车票,然后根据詹姆斯肌肉状态和今天的运动的类型安排他的三餐,并且给詹姆斯安排起程前需要做的训练都有哪些,然后评估詹姆斯回家这几天,锻炼量可能会下降,就会安排一个教练随行以保证它的训练量还有一下球员比赛之后必须要做某些运动才有继续训练的动力,这也被列入沃森的计算中,并且规定可以去的范围,最大程度保护球员的安全,23333。要不球员不比赛后大多都很快破产,因为沃森没了(阴谋论一波)。Linux中也有个人工智能history。
直接执行history命令就会显示当前系统全部的命令历史
假如我们没有正常退出终端History不会保存我们的命令历史,因为我们执行命令时,命令历史会默认保存在内存中,并且在$HISTSIZE中设定内存保存命令历史的条数,在$HISTFILESIZE指定命令保存文件中保留的条数。
有了命令历史,我们就可以轻易调用上一条命令:
!! 执行上一条命令
!# 执行第#条命令
History-c 清空命令历史
History-a 把命令历史中的命令保存到文件中
除此之外,我们在用户家目录中.history定义保存历史的格式
HISTSIZE:命令历史记录的条数
HISTFILE:指定历史文件,默认为~/.bash_history
HISTFILESIZE:命令历史文件记录历史的条数
HISTTIMEFORMAT="%F%T" 显示时间
HISTIGNORE="str1:str2:…" 忽略string1,string2历史,这里支持glob
控制命令历史的记录方式:
环境变量: HISTCONTROL
ignoredups 默认,忽略重复的命令,连续且相同为"重复"
ignorespace 忽略所有以空白开头的命令
ignorebothignoredups, ignorespace
erasedups 删除重复命令
4)bash的一下常用的快捷键
有事没事按table,按按更健康。
Ctrl+c 强行打断命令的执行
Ctrl+d 打断命令执行
Ctrl+l 清屏
Ctrl+z 把命令进程放到后台执行
Ctrl+a 把光标移至行首
Ctrl+e 把光标移至行尾
Ctrl+k 删除光标后面的字符
Ctrl+u 删除光标前的字符
3总结
bash调用命令顺序alias->内建命令->外部命令。Bash用hash缓存命令执行路径,用history记录命令历史,命令历史是保存内存中的,我们退出终端时命令历史保存到文件中,bash还有一些快捷键。