1.系统中输入输出的管理
1.理解系统的输入输出
输入设备: 就是键盘、鼠标和一些硬件设备在系统输入的字符
输出设备: 就是系统接收到我们想要实现的功能字符后,经过进程的处理产生字符并且输出到屏幕上
输入会有两种:编号1为正确输出,编号2为错误输出
默认这两种输出都会被系统定向到字符设备中 /dev /pts中
输入重定向<
表示从文件来输入 cat本身也就替代了输入
就是输入不希望由键盘来输入 使用<
tr就需要用到输入重定向
代表的是对位替换 比如把a替换为A b替换为B
直接使用报错
加入输入重定向
本身没有改变
如果加了参数 就不需要第二个了
第一个表示 删除文件中的abc
第二个表示删除文件中的大写字母
单行输入
eg:
vim westos
WESTOS
tr 'A-Z' 'a-z' < westos
此处创建文档 <<
这个仅仅只是输出一些格式
> 指明保存在哪个文件 << 输入是
表示此处写的数据可以保存在一个文档中
eg: vim test.sh
passwd <<EOF
123 ##录入到passwd中第一行
123 ##录入到passwd中第二行
EOF
##多行输入EOF开始录入再次出现EOF表示录入结束
2.管理输入输出的符号
数据流重导向
数据流重导向就是将某个指令执行后应该要出现在屏幕上的数据, 给他传输到
其他的地方,例如文件或者是设备 (例如打印机之类的)!
什么是数据流重导向
在上图当中, standard output 与 standard error output 分别代表“标准输出
(STDOUT)”与“标准错误输出 (STDERR)
1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
1> :以覆盖的方法将“正确的数据”输出到指定的文件或设备上;
1>>:以累加的方法将“正确的数据”输出到指定的文件或设备上;
2> :以覆盖的方法将“错误的数据”输出到指定的文件或设备上;
2>>:以累加的方法将“错误的数据”输出到指定的文件或设备上;
&> ##重定向所有输出
注意:
重定向会覆盖原文件内容
输出重定向
本来默认是输出到显示屏的,重定向到另一个文件中
甚至可以重定向到一个终端
先别回车
登录到tty1上
然后回车 就看到输出了
但是不要随便使用,比较危险
误操作可以使用set set -C 仅仅对当前shell有效
就是如果存在了文件就会提醒无法覆盖,不存在的时候才会正常重定向
如果确实想要覆盖 强行覆盖 不是管道符号哦
但是注意仅仅只能输出正确的输出流 如果是错误的没办法
因为不存在所以是错误输出,但是>,>>只能重定向正确的输出、
使用2>可以哦
刚才忘记关闭功能了
所以正确的输出和到屏幕上了
注意: >,>>只能输出正确流 2>,2>>只能输出错误流到具体的文件中
全部的&>> 合并
合并有两种方式哦 还可以使用把错误的转换为正确的
这个意思是如果正确追加到这个文件中 如果是不正确输出流就转换为正确的输出流也追加进去
查看文件
重定向
重定向的目的文件如果存在直接覆盖,如果没有也不需要提前建立,它会在重定向的同时建立这个文件
示例:
当你以一般身份执行 find 这个指令的时候,由于权限的问题可能会产生一些
错误信息.例如:
注意:以下实验必须在student(普通用户)用户下完成!!!
find /etc/ -name passwd > file ##定向正确输出到file
find /etc/ -name passwd 2> file.err ##定向错误输出到file.err,剩下的正确的将显示在shell
find /etc/ -name passwd &> file.all ##定向所有输出到file
> file ##清空file
范例,将错误的数据丢弃,屏幕上显示正确的数据
[dmtsai@study ~]$ find /home -name .bashrc 2> /dev/null
/home/dmtsai/.bashrc <==只有 stdout 会显示到屏幕上, stderr 被丢弃了
小结
:定向输出正确或者错误的到文件中时,剩下的错误或者正确的直接显示在shell命令框,并且定向输出到的目的文件的内容会被覆盖,文件不存在的时候会自动创建文件。
输出追加
>> ##追加正确输出到文件最后
2>> ##追加错误输出到文件最后
&>> ##追加所有输出到文件最后
注意:
追加不会覆盖源文件内容
示例:
find /etc/ -name passwd >> file ##追加正确输出到file
find /etc/ -name passwd 2>> file.err ##追加错误输出到file
find /etc/ -name passwd &>> file.all ##追加所有输出到file
3.输入重定向
< 又是什么呀?呵呵!以最简单的说法来说, 那就是“将原本需要由键盘输入的数据,改由文件内容来取代”的意思
范例:利用 cat 指令来创建一个文件的简单流程
[dmtsai@study ~]$ cat > catfile
testing
cat file test
#这里按下 [ctrl]+d 来离开
[dmtsai@study ~]$ cat catfile
testing
cat file test
由于加入 > 在 cat 后,所以那个 catfile 会被主动的创建,而内容就是刚刚键盘上面输入的那两行数据了。
唔!那我也可以用纯文本文件取代键盘的输入如下所示:
范例:用 stdin 取代键盘的输入以创建新文件的简单流程
[dmtsai@study ~]$ cat > catfile < ~/.bashrc
[dmtsai@study ~]$ ll catfile ~/.bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 /home/dmtsai/.bashrc
-rw-rw-r--. 1 dmtsai dmtsai 231 Jul 9 18:58 catfile
#注意看,这两个文件的大小会一模一样!几乎像是使用 cp 来复制一般!
<< 这个连续两个小于的符号了。 他代表的是“结束的输入字符”的意思!
举例来讲:“我要用 cat 直接将输入的讯息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束”,那我可以这样做:
看到了吗?利用 << 右侧的控制字符,我们可以终止一次输入, 而不必输入 [crtl]+d 来结束
为何要使用命令输出重导向呢?
- 屏幕输出的信息很重要,而且我们需要将他存下来的时候; 背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
- 一些系统的例行命令 (例如写在 /etc/crontab 中的文件) 的执行结果,希望他可以存下 来时;
- 一些执行命令的可能已知错误讯息时,想以“ 2> /dev/null ”将他丢掉时; 错误讯息与正确讯息需要分别输出时。
备注:上面描述的都是把一个命令的结果保存到文件中,或者从文件中读数据。
如何把一个命令的输出变成后一条命令的输入呢???
4.管道的应用
1.管道的作用
“|” 管道的作用是把前一条命令的输出变成后一条命令的输入
注意:
管道只允许正确输出通过!!!!!!!!!!!!!
通过管道的输入将会变成输入,而变成输入的这些输出是会被第二条命令处理的
如果需要保存输出内容,那么需要复制一份输出,用到的命令是“tee”
但是可以发现前面的结果都看不见,只能看到最后的结果
如果需要保存输出内容,那么需要复制一份输出,用到的命令是“tee”
此实验在普通用户下操作:
find /etc/ -name passwd | wc -l ##会看到的结果为2,因为错误输出不能通过管道
find /etc -name passwd 2>&1|wc -l
##会看到19,因为编号为2的输出被“2>&1”转换为编号1
本来只有2个正确的输出,2>&1将17个错误的输出转换为正确的输出,因此一共是19个
"2>&1" 将一个标准错误输出重定向到标准输出 注释:1代表标准输出 2代表错误输出
find /etc -name passwd 2>&1|tee file |wc -l
##保存一份输出到file再统计行数
注意:当使用tee时,一定要注意其与wc -l的顺序,如果wc -l在前,那么输出保存的内容便是wc -l统计的结果
5.vim的常用功能
d$ 从光标处删到该行结尾
d^ 从光标删除到改行行首
dd后p就可以粘贴到别的地方哈
dd一整行 p粘贴到光标所在行的下方
d$一部分 p粘贴到所在光标的后方
cc和dd的区别在于cc完了可以直接改行继续输入
dd完了不是输入模式
利用V 进入可视化
按行选定一部分区域
然后y
选定合适的位置p
就粘贴咯
如果dd之后就不用一直dd
直接.就可以记住并使用上次的命令dd哦
ig表示不区分大小写,把所有的this全部替换为THIS
第一行表示以t为开头的单词全部替换为以T为开头的
第二个表示给所有以t开头的单词都要加er
%s@^#@@g 把注释行全部替换为空行
3.
1.vim的模式
命令模式
浏览文件,临时更改vim的工作方式,对字符批量处理
插入模式
对文件内容进行编辑
退出模式
退出vim程序
命令模式
1)
调整vim的工作方式
在vim程序中
:set 调整参数
示例:
:set nu ##在每一行前显示行号
:set nonu ##取消行号显示
:set mouse=a ##显示鼠标
:set cursorline ##显示行线
注意:
在vim程序中设定的vim工作方式是临时的,在vim关闭后会还原
如果要永久保存vim的工作方式需要编辑vim的配置文件:/etc/vimrc
在vim中进行字符搜索使用 /关键字 ,n向下匹配,N向上匹配
进入之后G到文件最后,o到文件下一行。设置完成后:wq退出
2)
字符的搜索
/关键字
n向下匹配
N向上匹配
3)
字符的管理
y
yl ##复制一个字母<C-F12>
y3l ##复制3个字母
yw ##复制一个单词
y3w ##复制3个单词
yy ##复制1行
y3y ##复制3行
d
dl ##删除一个字母
d3l ##删除3个字母
dw ##删除1个单词
d3w ##删除3个单词
dd ##删除1行
d3d ##删除3行
c
cl ##剪切1个字母
c3l ##剪切3个字母
cw ##剪切1个单词
c3w ##剪切3个单词
cc ##剪切1行
c3c ##剪切3行
“注意:在剪切之后vim会进入插入模式,如果要粘贴需要按【esc】退出插入模式然后按p粘贴!!!”
p ##粘贴
u ##撤销
ctrl+r ##恢复撤销
- vim可视化模式
ctrl + v ##在这个模式下可以选择区域操作
批量添加字符
-
ctrl + v 选中要加入字符所在的列(利用上下健),在这个模式下可以选择区域操作,此时左下角出现了VISUSL BLOCK,表示进入了vim可视化模式
-
按大写的I,进入到插入模式
-
加入字符
-
按【esc】两次
小知识:如果想取消某一列注释,首先ctrl+v进入可视化模式,上下键选中注释符#,然后直接按【delete】,完成对注释的取消。
-
字符的替换
:%s/要替换的字符/替换成的字符/g :%s/:/@/g ##替换全文的:为@ :1,5s/:/@/g ##替换1-5行的:为@ :/adm/,/halt/s/:/@/g ##替换adm到halt之间的:为@ 注意: %s标示所有的行 g标示所有的列
所有的:都变成了@
1至5行:换成@
6)
vim 的分屏功能
ctrl+w s | ##上下分屏(先按ctrl+w再按s) |
---|---|
ctrl+w v | 左右分屏 |
ctrl+w c | 关闭光标所在屏幕 |
---|---|
ctrl+w 上下左右 | 光标移动到指定屏幕 |
:sp file2 | 同时编辑当前文件和file2 |
7)
在命令模式下光标的移动
gg | 光标移动到文件的第一行 |
---|---|
G | 光标移动到文件的最后 |
:数字 | 光标移动到到指定的行 |
插入模式
1)
插入模式下光标的移动
i ##光标所在位置插入
I ##光标所在行行首插入!!!!!!!!!!
o ##光标所在行下一行插入
O ##光标所在行的上一行插入
a ##光标所在字符的下一个字符插入
A ##光标所在行的行尾插入!!!!!!!!!!!!!!
s ##光标所在字符删除并插入!!!!!
S ##光标所在行删除并插入
vim的退出模式
:q ##退出,在文件内容没有被改变时使用
:wq ##退出保存
:q! ##强制退出不保存,在改变文件后不想保存时使用
:wq! ##强制退出保存 在对只读文件编写时使用,注意
所编辑的只读文件必须是当前用户的文件,或者当前操作的用户时root
cd
-e 支持的转义符
强引用,弱引用区别
单引号不会替换为变量,引用的是变量本身哦
月日时分年秒
Linux系统启动时从硬件读取日期和时间信息,读取完成后,就不再与硬件相关联
靠自己内核频率计时 比如内核震动100HZ 震动100次就是1秒
date查看系统时钟
clock查看硬件时钟
如果两个时钟不一致,有一个时间是准的
-s 表示以硬件为准
-w 表示以系统为准
to之前的准
Linux组成部分
能操作硬件的只有内核 内核把硬件封装起来
内核通过system core向外提供
内核把所有系统硬件功能转换为系统调用
所以程序想和内核打交道,大多数需要系统调用
内核不做具体性工作,只做通用性的任务,比如进程管理,内存管理,文件系统,硬件驱动,网络功能,安全加密等。
所有的具体工作都需要外部的应用程序完成。
灰色的就是应用程序,程序员通过系统调用完成开发、可以通过库函数实现、库实现只是 为了简化程序员研发的困难,有了库后把很多功能集合称为公共模块。一个库编译完成(二进制),没有独立的执行入口,只能被其他程序调用执行。
如果一个程序在开发的时候调用了库,这个程序启动为进程时,首先得把它依赖的库装载到内存中才能运行,因为库本身就是程序的组成部分。如果有一个程序员也调用了库,在编译时做静态编译,就是编译的时候把所调用的每个库都直接编译进程序中,也就是把依赖的库复制为副本放在程序中,由程序到任何位置可以直接执行,不用调用了
程序编译时分为动态编译和静态编译
上述就是静态编译和动态编译。
程序的编译方式、
库里面很多功能模块–就是程序偏度–只能被调用
编译就是把程序的源代码编译成二进制格式的CPU指令或者转换成汇编代码的过程!!!!!!!!!!!!!!
1.动态:把程序独立编译完。编译的时候明确说明,如果调用库到哪里去调用。程序中明确指明调用库的入口、只是需要的时候去库里调用即可。这个程序之后每次想要运行,我们把源程序装在到内核上,并且内核随之需要把需要的库也装在进来。否则程序无法运行。就是不把库编译进程序中,只是需要的时候调用。
如果编译好的程序放在别的系统上,必须把库复制过去。必须相应的路径。在/lib64,/usr/lib64
库在/lib64下
有较强依赖性
大大节约内存资源
2.静态:
在程序编译的时候,直接把库文件复制到程序内部。比动态的体积大。挪到任务系统上可以直接运行。
加入1000个程序都这样调用,存储了1000份,对存储不利,对内存也不利。
程序进程一部分时自启动执行的,一部分需要用户登录终端执行。
是一组硬件设备,可以关联一个用户接口
通过该接口和操作系统打交道。比如开启关闭某个程序
操作系统其实就是内核+应用程序+库
库就是代码,shell也是特殊的应用程序
可以理解为一个操作系统其实就是由内核文件和各种各样的程序文件,库文件组成。
甚至认为库文件也是程序文件。
每个应用程序包括库文件,二进制文件,帮助文件,配置文件等等超级多文件
如何有效管理文件?
通过文件系统实现组织为层级结构方便查找每个文件。
操作系统刚启动这个文件系统还没有开始,通过其他机制首先找到磁盘上的内核文件,把内核文件启动在内存中,内核自己启动后掌握整个硬件控制权,启动各种应用程序。应用程序启动之前都是一个一个的静态文件。存在文件系统。内核激活根分区并且装载到内存中,只需装在根位置以及必要的路径。然后启动一个一个程序。
不同的厂商开发不同的硬件 不管是惠普 还是x86 x64只要Linux内核可以支持,内核就可以把他们输出为同一种系统调用,所以在外层程序员可以使用同一个接口进行编程。可以无视内部的区别和复杂性。