目录
⛺️1.了解Linux目录配置标准FHS
⛺️2. Linux数据重定向的理解与操作
2.1 基本准备
2.2 重定向的理解
2.2.1 输出重定向 >
2.2.2 追加重定向 >>
2.2.3 输入重定向 cat
2.3 代码0,1,2的深入理解
2.3.1 >重定向的是标准输出数据
2.3.2 怎样重定向标准错误输出数据
2.3.3 怎样把标准错误输出直接抛弃
⛺️3. Linux管道命令的理解与操作
⛺️4. Linux 环境变量与PATH(重点)
4.1 引出的问题
4.2 问题的解决
FHS是什么? FHS本质一套规定Linux目录结构,软件建议安装位置的标准;
为什么有FHS标准? 使用Linux来开发产品或者发布软件的公司、个人太多,如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置,这无疑是一场灾难。
Linux目录标准?
bin -> usr/bin #可执行文件目录,linux自带命令在这里
boot #开机会使用到的文件,包括Linux核心文件以及开机菜单与开机所需配置文件等。
dev #设备目录
etc #配置文件几乎都放置在这个目录内,例如人员的帐号密码档、 各种服务的启始档等。
home #家目录,系统默认的使用者主文件夹,用户的个人文件都可放在这里
lib -> usr/lib #放置在开机时会用到的函数库,以及在/bin或/sbin下面的指令会调用的函数库
lib64 -> usr/lib64 #与lib类似
media #放置可移除的设备,包括软盘、光盘、DVD等等设备都暂时挂载于此。
mnt #设备临时挂载目录
opt #第三方协力软件放置的目录
proc #是一个虚拟文件系统,放置内存中的数据,不占用硬盘空间
root #系统管理员的主文件夹
run #放置系统开机后所产生的各项信息
sbin -> usr/sbin #里面包括了开机、修复、还原系统所需要的指令,root用户使用
srv #service是一些网络服务启动之后,这些服务所需要取用的数据目录。
sys #与proc类似
tmp #temp,让一般使用者或者是正在执行的程序暂时放置文件的地方
usr #unix software resource:与软件安装/执行有关
var #variable,与系统运行过程有关,主要为变动性较大的数据
基本大部分计算机,要与人交互,都要默认打开三个设备(文件)
首先我们先利用echo命令进行内容打印到屏幕,类似于C语言的printf
如果我们想把这句话不直接显示到屏幕上,而是存到屏幕里呢?这就需要输出重定向 >
如果在追加一句hello呢?
这样我们就可以得出输出重定向(>)结论:
写入到指定文件
写入是覆盖写入
输入的内容来源于键盘
输入的内容来源于文件
将文件打开,作为程序的输入源!
我们利用find命令,去查找所有目录下的test.c文件;这里用的是普通用户,查找的结果肯定是有正确的、也有因为权限不够错误的;那么如果我们把这些文件重定向到test.c文件会发生什么有趣的情况呢?
我们执行find / -name test.c > 111发现在111里只有标准输出被重定向进来了;错误的还是打印在屏幕上!
结论
通过上面两组数据的对比,可以得到:显示器输出的信息中,有正确的,也有错误的;>只把正确的进行了重定向!简言之就是>只重定向标准输出的数据!
那么我们怎么把标准错误输出也重定向进去呢?
我们再cat 111就会发现,标准输出和标准错误输出的信息全都重定向到test.c了!这里内容比较多,就不在截图验证了;感兴趣的小伙伴不妨实操一下!
我们想直接把标准错误数据直接抛弃,也不让它在屏幕上打印出来,怎么办呢?
我们通过通过参数2,把标准错误输出的信息丢到/dev/null,只打印正确的数据!那么/dev/null又是什么呢?可以简单把它理解为一个垃圾桶!
结论
>111:默认情况,重定向的是标准输出到111;
2> /dev/null:表示重定向标准错误到垃圾桶里,保留标准输出;
> /dev/null 2>&1:表示所有数据都不保留,丢到垃圾桶里;
所谓管道就是用过 "|" 把前一个的输出,作为后一个的输入!
例如:
如果我们只想显示前五个信息呢?
对于管道符见的最多的就是和grep在一块使用!grep是按照行为单位进行关键字的过滤!
比如:我们要查看 /etc/services配置文件里的所有出现services行的数据:
管道符我们可以一直这样筛选下去,比如;我们在2的基础上;利用wc -l命令统计一下,在etc/services文件里有多少行包含services关键字呢?这就需要在加一层管道符!
可见,管道是可以级联多条命令的,每条命令的结果输出,都作为输入,导入下一条命令。有点像流水线
在Linux中,命令、程序、工具可简单理解为可执行程序!既然是可执行程序,那么就可以直接运行!
我们通过一个例题,提出问题:
我们写一个hello world小程序放到test.c文件中,生成可执行程序,探讨一下,它的执行过程!
编译方法直接编译
(1)我们gcc test.c;就可以生成可执行文件,默认是生成a.out文件;例如:
(2)我们也可以用 -o选项,自己制定生成文件的名字,例如:
运行方式
对于ls命令是可执行程序,a.out和test也是可执行程序,那么为什么a.out和test需要带./才能运行,.代表当前路径,/代表命令分隔符;而ls可以直接运行呢?
我们不妨去想ls命令执行的方式一样,直接执行生成的可执行过文件a.out
会发现命令找不到!这就需要解释一下一个命令的执行过程:1.找到 2.执行;我们找都找不到怎么执行呢?
ls为什么能直接执行呢?因为在系统中,可执行程序的搜索路径是保存在一个“全局”变量中,PATH,给系统提供命令的搜索路径。是环境变量的一种!
所以ls能直接运行是因为它的路径/usr/bin在PATH中,我们当前运行的a.out路径/home/zl/japan并不在环境变量当中!如果想像ls那样直接运行,要把/home/zl/japan这个路径添加到环境变量PATH当中就可以了!
如何查看环境变量?echo $PATH
PATH:保存了多条路径!路径之间用“ :”冒号隔开!
PATH:从左向右一次进行程序的搜索,找不到就继续下一条路径,找到了就停下来;找不到就提示:未找到命令(command not found!)
如何让a.out像ls一样可以直接执行?
(1)方法1:利用cp把a.out拷贝到PATH的任何一条路径
这样在/usr/bin里找到a.out文件;但是千万不要这样干,因为会‘污染’指令集 !
(2)方法2:把a.out路径直接拷贝到PATH里
首先要明确a.out,用pwd查看到路径是/home/zl/japan;把这个路径加到PATH里,怎么加进去呢?利用export加进去!
先查看一下以前的路径
把/usr/home/japan路径加进去PATH;并打印查看
直接执行a.out
补充:env #显示当前用户环境变量!