8.1 shell介绍

 

shell是一个命令解释器,提供用户和机器之间的交互;

输入用户名、密码后进入的界面即一个shell

/etc/passwd中每行最后一段即为shell信息;

创建一个用户默认的shell/bin/bash

centos7默认使用的shellbash

其他shellzshksh等;

支持特定语法,如逻辑判断、循环(whilefor);

 

8.2 命令历史

 

显示用户使用过的命令

[root@hyc-01-01 ~]# history

[root@hyc-01-01 ~]# ls /root/.bash_history

/root/.bash_history history显示的信息在该文件中保存

 

最多保存命令数

[root@hyc-01-01 ~]# echo $HISTSIZE 是系统内置环境变量

1000 默认最多保存1000

有时使用history查看会发现bash.history中保存了超过1000条命令,这可能是因为部分命令仍在内存中,并没有写入文件中或变量$HISTSIZE被修改

 

清空命令历史

  …

  836  ls /root/.bash_history

  837  cat /root/.bash_history

  838  echo $HISTSIZE

  839  history

[root@hyc-01-01 ~]# history -c

[root@hyc-01-01 ~]# history

1       history

[root@hyc-01-01 ~]# cat /root/.bash_history

[root@hyc-01-01 ~]# cat /root/.bash_history

此时发现.bash_history中的命令历史内容没有被删除,说明history –c仅删除内存中的历史命令;

只有当用户退出终端时,内存中的历史命令才会被写入.bash_history文件中;

 

自定义$HISTSIZE

[root@hyc-01-01 ~]# vim /etc/profile

fi

 

HOSTNAME=`/usr/bin/hostname 2>/dev/null`

HISTSIZE=5000 $HISTSIZE修改为5000

if [ “$HISTCONTROL” = “ignorespace” ] ; then

export HISTCONTROL=ignoreboth

[root@hyc-01-01 ~]# echo $HISTSIZE

1000

[root@hyc-01-01 ~]# source /etc/profile 要使修改的HISTSIZE生效需要执行该命令或重启终端

[root@hyc-01-01 ~]# echo $HISTSIZE

5000

 

指定记录历史命令时记录命令执行时间

[root@hyc-01-01 ~]# HISTTIMEFORMAT=”%Y/%m/%d %H:%M:%S”

[root@hyc-01-01 ~]# echo $HISTTIMEFORMAT

%Y/%m/%d %H:%M:%S

[root@hyc-01-01 ~]# history 此时history显示的信息包含了日期和时间

    1  2018/06/28 07:26:30history

    2  2018/06/28 07:29:07cat /root/.bash_history

2       2018/06/28 07:35:14vim /etc/profile

变量HISTTIMEFORMAT默认不存在,每进入一个终端都需要配置

使HISTTIMEFORMAT永久生效:

[root@hyc-01-01 ~]# vim /etc/profile

HOSTNAME=`/usr/bin/hostname 2>/dev/null`

HISTSIZE=5000

HISTTIMEFORMAT=”%Y/%m/%d %H:%M:%S”

[root@hyc-01-01 ~]# source !$ 使变量立即生效(或重新打开终端)

source /etc/profile

 

阻止历史命令被删除

[root@hyc-01-01 ~]# chattr +a ./.bash_history

设置该参数后即使保存的命令数超过最大限制1000条也可以正常保存,因为文件被设置成不能删除内容

 

不正常退出

用户使用logoutexit命令属于正常退出,此时内存中的历史命令会写入.bash_history文件;

用户不正常退出时内存中的历史命令将不被写入文件,无法保存历史命令信息;

 

!!执行命令历史中的最后一条命令

[root@hyc-01-01 ~]# ls 执行了ls命令,此时命令历史中最后一条命令应为ls

111          111.tar.xz  3.txt      anaconda-ks.cfg.1  test

111.tar      111.zip     4.txt      hyc2               test.tar

111.tar.bz2  1.txt.xz    4.txt.bz2  ls2                test.txt

111.tar.gz   222         4.txt.zip  ls2.zip            新建文本文档.txt

[root@hyc-01-01 ~]# !!

ls 使用!!执行了ls

111          111.tar.xz  3.txt      anaconda-ks.cfg.1  test

111.tar      111.zip     4.txt      hyc2               test.tar

111.tar.bz2  1.txt.xz    4.txt.bz2  ls2                test.txt

111.tar.gz   222         4.txt.zip  ls2.zip            新建文本文档.txt

 

cd  执行命令历史中最近执行的一次cd命令

[root@hyc-01-01 ~]# history

  850  2018/06/28 19:45:45ls

  851  2018/06/28 19:48:55history

  852  2018/06/28 19:49:01cd

  853  2018/06/28 19:49:03w

  854  2018/06/28 19:49:08whoami

  855  2018/06/28 19:49:17lsattr

  856  2018/06/28 19:49:22history

[root@hyc-01-01 ~]# !cd

Cd

 

851 执行命令历史中第861行的命令

  852  2018/06/28 19:49:01cd

  853  2018/06/28 19:49:03w

  854  2018/06/28 19:49:08whoami

  855  2018/06/28 19:49:17lsattr

  856  2018/06/28 19:49:22history

  857  2018/06/28 19:50:35cd

  858  2018/06/28 19:53:05history

[root@hyc-01-01 ~]# !852

Cd

 

8.3 命令补全和别名

 

tab

可以补全命令或文件路径;

如果一串字符或命令补全时有多种选项,则连按两下Tab键会出现可供选择的项;

[root@hyc-01-01 ~]# w

w               wc              whereis         whoami          write

wait            wdctl           which           wipefs         

wall            weak-modules    while           wpa_cli        

watch           weather         whiptail        wpa_passphrase 

watchgnupg      whatis          who             wpa_supplicant 

[root@hyc-01-01 ~]# cd 1

111/         111.tar      111.tar.gz   111.zip     

1111/        111.tar.bz2  111.tar.xz   1.txt.xz

centos7中可以支持补全参数(centos6不支持),但需要安装包bash-completion

[root@hyc-01-01 ~]# yum install -y bash-completion

包安装完后必须重启系统才生效

[root@hyc-01-01 ~]# systemctl re 出现可补全的参数选项

reboot                 reload-or-restart      reset-failed

reenable               reload-or-try-restart  restart

reload                 rescue  

 

alias别名

定义新的别名

[root@hyc-01-01 ~]# alias restartnet=’systemctl restart network.service’

[root@hyc-01-01 ~]# restartnet

[root@hyc-01-01 ~]# alias 查看系统中所有的别名

alias相关配置文件

[root@hyc-01-01 ~]# vim /root/.bashrc 该文件中存在几个alias别名

# .bashrc

 

# User specific aliases and functions

 

alias rm=’rm -i’

alias cp=’cp -i’

alias mv=’mv -i’

[root@hyc-01-01 profile.d]# ls

256term.csh         colorgrep.csh  colorls.sh  less.csh  vim.sh

256term.sh          colorgrep.sh   lang.csh    less.sh   which2.csh

bash_completion.sh  colorls.csh    lang.sh     vim.csh   which2.sh

[root@hyc-01-01 profile.d]# pwd

/etc/profile.d 其余的alias在该路径下的文件中定义

取消自定义的别名

[root@hyc-01-01 profile.d]# unalias restartnet

[root@hyc-01-01 profile.d]# restartnet

-bash: restartnet: 未找到命令

 

8.4 通配符

 

* 可以放在任意位置匹配任何任意数量的字符字符

[root@hyc-01-01 ~]# ls 1*

111.tar  111.tar.bz2  111.tar.gz  111.tar.xz  111.zip  1.txt.xz

 

1:

1  11  111  a

 

111:

12.txt  12_txt.swp  2  22  222  2.txt  2.txt.t

 

1111:

 

匹配任意一个字符

[root@hyc-01-01 ~]# ls ?.txt

3.txt  4.txt

[root@hyc-01-01 ~]# ls *.txt

3.txt  4.txt  test.txt  新建文本文档.txt

 

[].txt 匹配方括号中的一个字符

[root@hyc-01-01 ~]# ls [1-3].txt 表示匹配1/2/3中任意一个字符

1.txt  2.txt  3.txt

[root@hyc-01-01 ~]# ls [13].txt 匹配13中任意一个字符

1.txt  3.txt

[root@hyc-01-01 ~]# ls [123].txt 匹配13中任意一个字符

1.txt  2.txt  3.txt

[root@hyc-01-01 ~]# ls [a-c].txt 匹配a/b/c中任意一个字符

a.txt  c.txt

[root@hyc-01-01 ~]# ls [0-9a-c].txt 匹配09中任意一个数字或ac中任意一个字母

1.txt  2.txt  3.txt  4.txt  a.txt  c.txt

 

{}.txt 匹配括号内字符的其中一项,使用逗号分隔

[root@hyc-01-01 ~]# ls {1,2,3}.txt

1.txt  2.txt  3.txt

 

ls –a输出的信息重定向到1.txt

[root@hyc-01-01 ~]# ls -a 1>1.txt 默认>左边的1可以省略

 

[root@hyc-01-01 ~]# cat1.txt 2>2.txt 2表示报错信息

[root@hyc-01-01 ~]# cat 2.txt

-bash: cat1.txt: 未找到命令

[root@hyc-01-01 ~]# ls 2.txt ls3 &> 2.txt 将正确和错误信息全部输出到2.txt

[root@hyc-01-01 ~]# cat 2.txt

ls: 无法访问ls3: 没有那个文件或目录

2.txt

 

[root@hyc-01-01 ~]# ls 2.txt ls3 1> 2.txt 2>4.txt 分别将正确和错误的输出信息输出到不同文件

[root@hyc-01-01 ~]# cat 4.txt

ls: 无法访问ls3: 没有那个文件或目录

[root@hyc-01-01 ~]# cat 2.txt

2.txt

 

输入重定向

[root@hyc-01-01 ~]# wc -l < 2.txt 2.txt的内容输入到命令wc –l中(使用wc –l查看2.txt行数)

1

[root@hyc-01-01 ~]# 4.txt < 2.txt 不支持从文件输入重定向到文件

-bash: 4.txt: 未找到命令

只能输入到命令