光标快速移动
ctrl+a到命令的第一个字符
ctrl+e到命令的最后一个字符
删除光标前后内容:
crtl+w直接删除光标前一个单词
ctrl+k 删除光标后所有字符
ctrl+u删除光标前所有字符
ctrl+y粘贴删除的命令
ctrl+c不执行当前命令
清屏快捷键
ctrl+l,windows下的清屏是cls
[root@zhanghe ~]# !! #执行上一个命令
[root@zhanghe ~]# ! 6 #执行命令历史中第6个命令
[root@zhanghe ~]# !man #执行历史命令中以最近一次man开头的命令
ctrl+r:进行命令的搜索
一级目录
/boot:存放系统启动相关的文件
/dev:存放设备文件
/etc:存入配置文件
/home:用户的家目录
/root:管理员的家目录
/lib:库文件
/media和/mnt:挂载点目录
/opt:可选目录,第三方程序的安装目录
/proc:伪文件系统,内核的映射文件
/sys:伪文件系统,跟硬件设备相关的属性映射文件
/var:可变化的文件
/bin:可执行文件,用户的命令
/sbin:管理命令
/usr:一个单独的“小世界”。既然根下已经有了/bin,/sbin,/lib等目录,那么为什么在这个目录下面还有呢?因为根下的/bin,/sbin,/lib,都是系统启动的程序相关,而/usr下的的/bin,/sbin,/lib等等都是为了系统的能够启动的基本功能。
/usr/local:又是一个单独的“小世界“,这是第三方软件真正的安装位置,这一个小世界对系统的启动和功能都没有影响,即使没有也不会影响系统的启动和运行。
文件类型man章节f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件
定向和管道1 用户命令
2 系统调用
3 c库调用
4 设备文件及特殊字符
5 配置文件格式
6 游戏
7 杂项
8 管理命令
输出重定向
程序默认从文件当中读入数据,比如我们使用:cat /etc/passwd
的时候,就是让cat从/etc/passwd
中读入数据,但是如果我们不给cat
指定读入数据的地方,默认是从键盘当中读取数据,从键盘当中读取数据就叫做标准输入;输出的位置可以是屏幕、打印机、硬盘,默认是输出到屏幕上,如下:
[root@localhost ~]# echo "123" > ./zhanghe
[root@localhost ~]# cat ./zhanghe #给cat指定读入的数据
123
[root@localhost ~]# cat #不给数据,就默认从键盘中读取,标准输入
zhanghe
zhanghe
hanjiodjfe
hanjiodjfe
标准输入从键盘当中读取数据,而键盘和屏幕在linux上也有对应设备文件,每当我们使用一个设备的文件时候,内核都要对设备文件进行追踪,内核只会通过二进制识别追踪,不会根据文件名进行跟踪,所以内核就会给每个打开的设备文件分配一个二进制的标识:file descirptor(文件描述符),简称:fd,,给键盘设备文件分配的标识为0,而对屏幕设备文件分配的标识为1,屏幕就是标准输出。
命令执行成功的返回值是由命令返回的,而命令执行失败的返回信息不是由命令返回的,而是由shell返回的。
[root@localhost ~]# ls #命令输入正确由命令返回信息
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates zhanghe
[root@localhost ~]# lss #命令输入失败由bash返回信息,ls根本就没有执行
bash: lss: 未找到命令...
shell又是怎样知道我们命令输入错误呢?因为bash
是一个命令解析器,在bash提请到内核之前做词法分析判断你输入的命令是否正确?那么它是怎样分析的呢?bash利用空格把我们输入的信息进行切段,然后进行判断哪一部分是命令?哪一部分是参数?哪一部分是选项?然后再判断命令正确与否?那么又是怎样判断的命令的正确与否呢?bash会根据我们输入的命令去PATH变量当中的那些路径查找命令对应的二进制程序,如果shell在PATH当中的路径找不到命令对应的二进制程序就判定命令输入错误并向标准输出输出错误信息:“bash:未查找到命令”,如果找到的话就把此命令和其对应的路径当做一个键值保存起来,下次再使用到这个命令的时候先去hash里面查找,如果找到的话直接使用命令其后对应的路径,如果找不到再去PATH变量中挨个查找。
如果判断命令错误的话就会bash返回信息,根本不会向内核提请,但是如果命令输入正确,但是选项或者参数没有输入正确的话,bash是检测不出来的,错误的选项或者是参数都由命令返回,如下图:
[root@localhost ~]# ls -hello #输入的选项错误
ls:无效选项 – e #错误返回的信息由ls命令返回,并不是bash返回的
Try 'ls --help' for more information.
[root@localhost ~]# ls /hello/ #输入错误的选项也是如此,错误由程序检测并返回
ls: 无法访问/hello/: 没有那个文件或目录
标准错误的输出也是到屏幕当中,但是与标准成功输出不同的是,内核追踪标准成功的输出的fd是1,而追踪标准错误输出的fd是2,两个输出是相互独立的。
让我们来总结一下:
标准输入是键盘,设备文件的标识符是0,标准输出是屏幕,设备文件标识符是1
标准正确输出是屏幕,设备文件的标识符是1
标准错误输出也是屏幕,设备文件的标识符是2
什么叫做重定向呢?
“>”覆盖操作太危险了,因为会把原有文件的内容删除,如果目标文件不存在的话,就相当于创建一个文件。为了避免这种危险的操作,linux给这种操作做一个开关即:set –C,使用这个命令之后覆盖操作的目标如果之前有数据存在话就会不允许操作,如果目标文件不存在的话就会允许操作,此命令并不对追加有效,追加可以正常使用。set +C
可以把set –C
给取消,也可以使用“ >|”强制进行覆盖。
set –C
只对当前shell有效。
[root@zhanghe tmp]# echo "zhanghe" >./zhanghe
[root@zhanghe tmp]# echo "zhangjia" >>./zhangjia
#如果目标文件不存在的话无论是追加还是覆盖都相当于重新创建一个文件
[root@zhanghe tmp]# ls
zhanghe zhangjia
[root@zhanghe tmp]# **set –C** #开启防覆盖功能
[root@zhanghe tmp]# echo "zhangwei" >./zhangjia #覆盖不允许,报错
-bash: ./zhangjia: cannot overwrite existing file
[root@zhanghe tmp]# echo "zhangwei" >>./zhangjia #追加没有被影响
[root@zhanghe tmp]# touch hao
//目标文件存在,但是里面没有任何内容也会被禁止,只要目标文件存在就不允许覆盖,无论目标文件里面有没有内容。
[root@zhanghe tmp]# echo "51465" >./hao
-bash: ./hao: cannot overwrite existing file
[root@zhanghe tmp]# echo "51465" >|./hao #强行覆盖
[root@zhanghe tmp]# set +C #取消set -C
[root@zhanghe tmp]# echo "51465" >./hao
>和>>只能针对正确的数据流,但是对于错误的输出无效,因为错误的输出和成功的输出虽然都是输出到屏幕,但是标准成功和标准错误是两个独立的数据流,例如:
[root@zhanghe tmp]# ls /tmp >./tmp
[root@zhanghe tmp]# ls /tmmpp >./tmp #针对错误的数据流无效
ls: 无法访问/tmmpp: 没有那个文件或目录
如果想把错误的输出重定向到文件怎么办呢?我们上面提到过内核追踪标准错误输出的fd号是2,那么我们把这个fd号指向文件即可 。从这里我们也可以看重定向的覆盖和追加默认都是1(标准正确)
[root@zhanghe tmp]# ls /tmmpp 2>./tmp
[root@zhanghe tmp]# cat ./tmp
ls: 无法访问/tmmpp: 没有那个文件或目录
如果我们让命令执行成功的话,后面也跟上2>NEW_FILE的话会怎么呢?这也很好理解,因为2>./tmp是告诉命令把标准错误信息输出到./tmp文件,但是这个命令执行成功了,并没有产生错误信息,于是就把成功的信息默认输出到fd1,即屏幕
[root@zhanghe tmp]# ls /tmp 2>./tmp #后面的2>./tmp没有生效
hao tmp zhanghe zhangjia
输入重定向
命令默认从标准输入即0(键盘)读入数据,但是我们可以给命令指定不同的数据读入的地方。下面介绍一个命令tr的使用,听说tr与输入重定向更配哦!!
扩展:
tr- translate or delete characters #替换或者删除字符
-d, --delete
#从标准输出当中输入数据,把小写的abc替换成为大写的ABC
[root@zhanghe tmp]# tr abc ABC
abcdfejklgkaj
ABCdfejklgkAj
[root@zhanghe tmp]# tr -d h #从标准输出读入数据,然后把d全部删除
zhanghe
zange
#改变其输入的位置,把所有的小宝字母都替换成大写字母
[root@zhanghe tmp]# tr "a-z" "A-Z" </etc/passwd
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
学到这里我有一个疑问:标准输入默认从键盘当中读入数据,但是我们使用一个命令时,比如cat一个文件的时候,我们并没有使用标准输入重定向的符号“<” 而是直接使用cat PATH/TO/FILE
即可,这是为什么?
答:因为命令都有自带的属性,当我们使用cat 后面默认自带了一个重定向的符号,只不过不可见.cat PATH/TO/FILE
其实就相当于cat <PATH/TO/FILE
,举个例子:
[root@zhanghe tmp]# cat ./zhanghe
zhanghe
[root@zhanghe tmp]# cat <./zhanghe #我们加上“<”也是正确的,正常执行
zhanghe
输入重定向一定只用一个“<”,一般不会使用“<<”
“<<”代表此处输入生成文档,我们需要自定义退出的符号,例如:
//stop就是自定义的退出符号
[root@zhanghe tmp]# cat << stop
> how are you
> how old are you
> stop
how are you
how old are you
//下面这个的意思是从标准输入上输出内容,通过输入stop停止,最后将内容生成一个文件00.txt
[root@N2 ~]# cat << stop > 00.txt
//意思是从标准输入里面输入数据,然后追加重定向到he文件,输入stop退出。
[root@zhanghe tmp]# cat >>./he << stop
> how are you
> what is you name?
> stop
[root@zhanghe tmp]# cat ./he
how are you
what is you name?
//使用这种格式也可以实现复制并创建文件的效果
[root@zhanghe tmp]# cat >./he
管道
前一个命令的输出送给后一个命令当输入,组合小程序完成大任务
[root@zhanghe /]# echo "$PATH" | tr "a-z" "A-Z" | tr -d "B"
/USR/LI64/QT3.3/IN:/USR/LOCAL/SIN:/USR/LOCAL/IN:/SIN:/IN:/USR/SIN:/USR/IN:/R
[root@zhanghe /]# cat /etc/passwd | tr "a-z" "A-Z" | less
tee - read from standard input and write to standard output and files ,#读取来自标准输入的信息然后输出到屏幕和文件当中,一次输入,两路输出。
例如:
[root@zhanghe /]# tee zh
how ara you ?
how ara you ?
what you name ?
what you name ?
^C
[root@zhanghe /]# cat zh
how ara you ?
what you name ?
那么这个命令有什么用呢?在写脚本的时候用的到:
[root@zhanghe /]# echo "$PATH" | tee zj | tr "a-z" "A-Z"
#把PATH变量当中的内容送给tee,tee打印一份到屏幕,另一份输入到zj文件,打印到屏幕的那一份又送给tr把大写字母替换成小写字母,注意,tee有覆盖属性
/USR/LIB64/QT3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/
[root@zhanghe /]# cat zj
/usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/
从上面我们还可以看出一个信息,tee命令可以截取在脚本执行过程中任一命令执行结果保存到文件当中。