一、命令历史

1. history命令使用

如果你经常使用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 –c

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 –d #

4执行结果:删除指定的历史命令

[root@www ~]# history -d 1038

2. 调用过去执行的命令

(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

3. 调用过去执行的命令的最后一个参数

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