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还有一些快捷键。

时间: 2024-08-01 14:17:49

4FHS和bash的相关文章

Linux Bash 提示符的一些骚操作

当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符:[[email protected]$host ~]$你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~ 如何设置 Bash 提示符 Bash 提示符是通过环境变量 PS1 (提示符字符串 1Prompt String 1) 来设置的,它用于交互式 shell 提示符.当然如果你需要更多的输

Bash脚本之函数定义和调用

把那些在脚本中重复出现并且没有任何改变的代码,封装起来,在适当的场景中调用执行.程序员将这种被封装起来的代码称为功能体,或者叫模块,也称为函数.这样看来是不是和循环类似,循环也是为了方便去多次执行一堆代码,而函数是将一堆代码写在一起,起一个名字,然后在需要这堆代码的时候只需要写上函数的名字即可.在shell脚本编程中,函数是由若干条shell命令组成的语句块,函数里面的内容和shell程序形式上是一致的.不同之处就是,shell代码可以直接被执行,而函数中的内容,不能独立执行,只有被调用的时候才

Bash 的若干基本问题

Bash 的若干基本问题 这里介绍一些bash启动前.后的问题,以及一些使用bash需要注意的基本问题. 1.Bash的介绍 Bash是一种Shell程序,它是一般的Linux系统中的默认的Shell程序,一般情况下Bash指的是/bin/bash这个软件. 一个Linux系统中有多少个可用的Shell程序,可以从/etc/shells文件中查出来. 当前登录用户的默认Shell是哪一个,可以从/etc/passwd文件中与此用户对应的那一行最后一个字段看出来.或者也可以通过echo $SHEL

bash

bash编程 if 条件判断; then fi if 条件判断; then 内容 else 内容 fi

004-用户、组、权限管理命令及bash配置文件、管道、重定向、grep

l  1.用户管理命令 1.)创建用户命令 useradd  [OPTIONS] USERNAME -u(UID):指定用户UID -g(GID):指定基本组 -G( group,...):指定附加组 -c"COMMENT":指定注释信息 -d(home_dir):指定家目录/path/to/directory -s:指定SHELL路径(/etc/shells指定了当前系统可用的安全shell) -m –k:强行为用户创建家目录 -M:不创建用户家目录 /etc/login.defs

bash编程

变量:命名内存空间 变量类型:事先确定数据的存储格式和长度 字符 数值 1.整型 2.浮点型 日期时间 布尔型 算数运算 逻辑运算:与.或.非.异或 shell:弱类型编程语言 强:变量在使用前必须声明,甚至要初始化变量.数字型初始化为0,字符型初始化为空NULL 弱:变量用时声明,甚至不区分类型,默认是字符串. 变量赋值:VAR_NAME=VALUE bash变量类型 环境变量 本地变量(局部变量):与bash进程关联的变量 位置变量 特殊变量(系统变量):linux内置,用于保存特殊数据的变

bash 数组参数的传递

一.方式一 把数组参数当做普通变量传递 #!/bin/bash function arrayfun { echo "get function parameter $*" } arraypara=(claire obama george) arrayfun $arraypara 上面脚最终会显示 get function parameter claire 只收到了数组中的第1个参数 二.方式二 我们改动一下 #!/bin/bash function arrayfun { echo &qu

bash简单for循环2

写一个脚本:输入三个参数 0,1,2,3之一输入3:计算100以内所有能被3整除的正整数的和:输入2:计算100以内所有所有偶数的和:输入1:计算100以内所有所有奇数的和:输入0:计算100以内所有所有整数的和: 代码 #!/bin/bash # declare -i SUM=0 if [ $1 == 3 ];then   for I in {1..100};do     if [ $[$I%3] -eq 0 ];then       SUM=$[$SUM+$I]     fi   done

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(2)

三.命令历史bash从Korn Shell和C Shell中吸收了很多的精华,其中之一正式为已经执行过的命令保存一个缓存副本的特性,我们称之为"命令历史"功能.我们为什么要使用命令历史功能呢?每个用户登录成功之后,尤其是使用bash这样的文件接口登录之后,所有的操作都是由执行命令来实现的,那么就不可避免的会出现重复执行某个命令的情况,如果每个命令都依靠键入的方式来输入的话,固然没有问题,但是效率不高而且也是浪费时间的"可耻"行为,命令历史刚好给我们提供了解决这种问题