如果你经常使用Linux命令,那么使用history命令无疑会提升你的工作效率。
history命令主要用于显示历史指令记录内容,下达历史记录中的指令。
bash会记录此前用户在shell会话中执行的命令于缓冲区中,正常退出时会被记录于当前用户家目录下隐藏文件~/.bash_history中。
当我们以bash登录Linux主机之后,系统会主动从当前用户家目录的~/.bash_history文件读取以前用过的命令,那么其文件会记录几条数据呢?
历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量通过echo $HISTSIZE可以知道。
历史命令在账户注销时,会将最近的HISTSIZE条记录到当前账户的记录文件中。
环境变量:
echo $HISTFILE <-- 命令历史文件存放路径
echo $HISTSIZE <-- 命令历史输出的记录数,即输出~/.bash_history文件中的最后HISTSIZE行
echo $HISTFILESIZE <-- 定义了~/.bash_history文件中保存命令的记录总数,可以理解为.bash_history文件中最多只有HISTFILESIZE行
用例:
(1) history
4执行结果:列出目前缓冲区内最近HISTSIZE行历史命令
(2) history �Cc
4执行结果:清空当前shell中的所有历史命令
(3) history n
4执行结果:打印最近的n条历史命令
[root@www ~]# history 10
991 vim ~/.vimrc
992 vim ~/.bashrc
993 vi ~/.bashrc
994 ll -a
995 . ~/.vimrc
996 exit
997 quit
998 exit
999 history
1000 history 10
(4) history -w
4执行结果:立即将当前历史命令缓冲区命令写入历史命令文件中,仅保留最新的
(5) history -a
4执行结果:将当前新增命令手动追加至历史命令文件中
(6) history -r
4执行结果:将历史命令文件中的命令读入当前历史命令缓冲区
(7) history �Cd #
4执行结果:删除指定的历史命令
[root@www ~]# history -d 1038
(1) !number
4执行结果:调用历史缓冲区内的第几条命令
[root@www ~]# !1038
ll
total 10884
-rw-------. 1 root root 2048 Aug 17 20:03 anaconda-ks.cfg
-rw-r--r--. 1 root root 11058322 Sep 16 15:04 etc.tgz
-rw-r--r--. 1 root root 63620 Aug 17 20:03 install.log
-rw-r--r--. 1 root root 11949 Aug 17 19:56 install.log.syslog
(2) !string
4执行结果:搜寻历史缓冲区内最近一个以string开头命令,并执行
[root@www ~]# !de
declare |wc -l
108
(3) !!
4执行结果:重复执行上一条命令
(4) Ctrl+r
4执行结果:使用反向查询历史命令,将匹配的最新一条显示出来,如果还想继续向上查询,继续按Ctrl+r
[root@www ~]# history 3
1048 14-11-02 16:35:52 history 3
1049 14-11-02 16:36:11 head ~/.bash_history
1050 14-11-02 16:41:05 history 3
(reverse-i-search)`his': head ~/.bash_history
ESC+.
(1) *
匹配任意长度的任意字符(代表0个到无穷多个任意字符),如 *.conf,a*b
(2) ?
匹配任意单个字符,如 ?abc?.txt
(3)[ ]/[-]
匹配指定范围内的任意单个字符,如[1-8],[l,i,n,u,x]
(4)[^]
匹配指定范围外的任意单个字符,如[^A-Z]
(1) #
批注符号,常用在shell script中,视为说明注释,不会被执行。
#!/bin/bash
bash脚本引导符号,即bash编译起始语句。
(2) \
转义符号,将“特殊字符或通配符”还原成一般字符
放在指令前,取消其别名的作用
放在指令最末端,表示指令连接下一行
(3) |
管道符号,把上条指令的标准输出,作为下条指令的标准输入。
如:set | grep ‘HIST’
(4) ;
连续命令执行分隔符,连续性命令的界定。
如:cd /;mkdir lab;cp /etc/sysconfig/. /lab
(5) ~
用户的家目录
(6) $
变量符号,提取变量。正则表达式中表示行尾
(7) &
单个&符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
如:tar cvfz data.tar.gz data > /dev/null&
(8) !
逻辑非符号,如:ls a[!0-9] 表示显示除a0,a2,…a9以外的文件。
(9) /
目录符号,路径分隔符号。运算中,代表除法的符号。
(10) ‘ ’
单引号表示把它所包含的内容作为普通字符,无特殊例外。
如:[root@www ~]# echo There are some '$animals'
There are some $animals
(11) “ ”
双引号具有变量置换的功能。
如:[root@www ~]# echo There are some "$animals"
There are some cat
(12) ` `
反单引号,表示包含其内的命令可以执行,也可以使用$( )。
如:fdv=`date +%F`;echo "Today $fdv"
(13) ( )
用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=`pwd` ;echo $vcgh),指令群组有一个特性,shell会以产生 subshell来执行这组指令。因此,在其中所定义的变量,仅作用于指令群组本身。
(14) { }
大括号被运用到函数的功能上,它在当前shell执行,不会产生subshell
此外,大括号还有另一种用法,如下{xx,yy,zz,...},这种大括号的组合,常用在字串的组合上,来看个例子mkdir {userA,userB,userC}-{home,bin,data}我们得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data, userC-home, userC-bin,userC-data,这几个目录。
(15) **
次方运算符
如:
[root@www lab]# let sus=2**3
[root@www lab]# echo sus=$sus
sus=8
1. 什么是标准输出与标准错误输出?
standard output标准输出指的是命令执行所回传的正确的信息。
standard error output标准错误输出指的是命令执行失败后,所回传的错误信息。
2. 什么数据重定向?
由于不管正确或错误的数据都是默认输出到屏幕上,所以屏幕比较混乱。而数据重定向可以将stdout与stderr分别传送到其他的文件或设备去。
(1) 标准输入(stdin): 代码为0,使用<或<<;
(2) 标准输出(stdout): 代码为1,使用>或>>;
(3) 标准错误输出(stderr): 代码为2,使用2>或2>>。
3. 正确数据重定向文件的方式
[root@www ~]# ll -ah > rootfile.pos
a. 该文件若不存在,系统会自动将它创建起来;
b. 当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入;
c. 若以>输出到一个已存在的文件中,那个文件就会被覆盖掉;
d. 追加内容到该文件中,须用>>输出,原文件里的内容不会丢失。
如:[root@www ~]# ll -ah /lab >> rootfile.pos
4. 错误数据重定向文件的方式
[root@www ~]# su - Allen
[Allen@www ~]$ find /home -name .bashrc
find: `/home/abc': Permission denied
find: `/home/lost+found': Permission denied
/home/Allen/.bashrc
find: `/home/bash': Permission denied
find: `/home/basher': Permission denied
find: `/home/rainman': Permission denied
find: `/home/nologin': Permission denied
find: `/home/hadoop': Permission denied
find: `/home/testbash': Permission denied
这些错误信息如何在屏幕不会出现呢?
使用2>或2>>来覆盖或累加至指定文件中,可以方便分别将错误信息与正确数据输出到不同文件内。
[Allen@www ~]$ find /home -name .bashrc > list.good 2> list_err
5. 同时重定向标准输出流和错误输出流:
COMMAND > /path/to/file.out 2> /path/to/file.err
COMMAND > /path/to/file.out 2>&1 定向输出流
COMMAND &> /path/to/file.out 重定向同一个文件中
6. /dev/null垃圾黑洞设备与特殊写法
command >/dev/null 2>&1 & == command 1>/dev/null 2>&1 &
1) command:表示shell命令或者为一个可执行程序
2) >:表示重定向到哪里
3) /dev/null:表示Linux的空设备文件
4) 2:表示标准错误输出
5) &1:&表示等同于的意思,2>&1,表示2的输出重定向等于1
6) &:表示后台执行,即这条指令执行在后台运行
1>/dev/null:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。
2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空。
所以可以看出" >/dev/null 2>&1 "常用来避免shell命令或者程序等运行中有内容输出。
7. 输入重定向
1) 用某个文件的内容来替换键盘输入
[Allen@www ~]$ cat > abc < /etc/fstab
[Allen@www ~]$ ll abc;ll /etc/fstab
-rw-rw-r--. 1 Allen Allen 899 Sep 22 16:22 abc
-rw-r--r--. 1 root root 899 Aug 17 19:30 /etc/fstab
2) 用文档结束标志符代替ctrl+d
[Allen@www ~]$ cat > 123 << eof (文档结束标志符)
> hello
> are
> you
> eof