linux 学习笔记-023-shell 介绍,命令历史,命令补全和别名,通配符和输入输出重定向

发布于 2018-01-30  343 次阅读


shell 介绍

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

支持特定语法,比如逻辑判断、循环

每个用户都可以有自己特定的 shell

CentOS7 默认 shell 为 bash(Bourne Agin Shell)

还有 zsh、ksh 等

[root@aming-01 ~]# yum list | grep zsh

autojump-zsh.noarch                      22.3.0-3.el7                  epel     

zsh.x86_64                               5.0.2-28.el7                  base     

zsh-html.x86_64                          5.0.2-28.el7                  base     

zsh-lovers.noarch                        0.9.0-1.el7                   epel     

[root@aming-01 ~]# yum list | grep ksh

ksh.x86_64                               20120801-34.el7               base     

mksh.x86_64                              46-5.el7                      base     

python-XStatic-Rickshaw.noarch           1.5.0.0-4.el7                 epel     

python-moksha-common.noarch              1.2.3-2.el7                   epel     

python-moksha-hub.noarch                 1.5.3-2.el7                   epel     

python-moksha-wsgi.noarch                1.2.2-2.el7                   epel    

命令历史

用户家目录下的 bash_history 存放着之前敲过的命令,能存放 1000 条

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

/root/.bash_history

使用 history 查看都有哪些历史记录信息

[root@aming-01 ~]# history

查看变量 HISTSIZE 可以知道能存放多少条历史记录信息

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

1000

可以使用 history -c 来清楚历史记录信息,数值不对是因为内存的缓存问题,history -c 并不会清空配置文件 bash_history

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

[root@aming-01 ~]# history

34  history

刚敲过的命令不会存放到配置文件 bash_history ,会先保存到内存中,可以通过 history 查看刚敲过的命令,history 中的命令历史记录会在退出终端的时候保存到配置文件 bash_history

[root@aming-01 ~]# ls

001.txt.bz2  321      321.tar.bz2  3.txt.bak       anaconda-ks.cfg.1

002.txt      321.tar  321.tar.gz   aminglinux.log  yum.log

[root@aming-01 ~]# ls

001.txt.bz2  321      321.tar.bz2  3.txt.bak       anaconda-ks.cfg.1

002.txt      321.tar  321.tar.gz   aminglinux.log  yum.log

[root@aming-01 ~]# history

34  ls

35  history

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

………………省略部分输出信息………………

curl members.3322.org/dyndns/getip

ping mirrors.163.com

curl members.3322.org/dyndns/getip

ping mirrors.163.com

环境变量 HISTSIZE 在/etc/profile 中定义,修改变量数值后需要 source 一下另它生效

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

HISTSIZE=5000

:wq

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

1000

[root@aming-01 ~]# source /etc/profile

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

5000

通过修改变量 HISTTIMEFORMAT 改变 history 显示的格式(以下这种方式只能对当前终端进行修改)

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

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

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

[root@aming-01 ~]# history

34  2018/01/05 00:59:12 ls

35  2018/01/05 00:59:17 history

36  2018/01/05 00:59:30 cat /root/.bash_history

37  2018/01/05 01:02:27 vim /etc/profile

38  2018/01/05 01:04:31 echo $HISTSIZE

39  2018/01/05 01:04:40 source /etc/profile

40  2018/01/05 01:04:41 echo $HISTSIZE

41  2018/01/05 01:11:52 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

42  2018/01/05 01:12:07 echo $HISTTIMEFORMAT

43  2018/01/05 01:12:10 history

永久修改 history 显示的格式

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

HISTSIZE=5000

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

:wq

[root@aming-01 ~]# source /etc/profile

[root@aming-01 ~]# history

34  2018/01/05 00:59:12 ls

35  2018/01/05 00:59:17 history

36  2018/01/05 00:59:30 cat /root/.bash_history

37  2018/01/05 01:02:27 vim /etc/profile

38  2018/01/05 01:04:31 echo $HISTSIZE

39  2018/01/05 01:04:40 source /etc/profile

40  2018/01/05 01:04:41 echo $HISTSIZE

41  2018/01/05 01:11:52 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

42  2018/01/05 01:12:07 echo $HISTTIMEFORMAT

43  2018/01/05 01:12:10 history

44  2018/01/05 01:14:24 vim /etc/profile

45  2018/01/05 01:15:13 source /etc/profile

46  2018/01/05 01:15:32 history

不正常退出终端,历史命令会保存不全

设置配置文件只能追加不能删除

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

[root@aming-01 ~]# lsattr /root/.bash_history

-----a---------- /root/.bash_history

快捷选项解释

!! == 上一条命令

!n == n 代表数字,输入 12,则运行历史记录中的第 12 条命令

!word == word 代表字符,输入 echo,则会运行历史记录中倒着数以 echo 开头的命令

命令补全和别名

tab 键自动补全:可以补全命令和命令的参数

Centos7 支持参数的补全:安装 bash-completion 包并重启系统

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

[root@aming-01 ~]# reboot

别名:alias

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

[root@aming-01 ~]# restartnet

[root@aming-01 ~]# alias

alias cp='cp -i'

alias egrep='egrep --color=auto'

alias fgrep='fgrep --color=auto'

alias grep='grep --color=auto'

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias mv='mv -i'

alias restartnet='systemctl restart network.service'

alias rm='rm -i'

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

每个用户都有自己的别名配置文件~/.bashrc

[root@aming-01 ~]# vim /root/.bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

# Source global definitions

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

还有部分 alias 的定义在/etc/profile.d/目录下存放着

[root@aming-01 ~]# ls /etc/profile.d/

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

取消自定义的 alias

[root@aming-01 ~]# unalias restartnet

[root@aming-01 ~]# restartnet

-bash: restartnet: 未找到命令

通配符

*:不分字符,不分几个的通配符

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

002.txt

[root@aming-01 ~]# ls *txt*

001.txt.bz2  002.txt  3.txt.bak

?:表示一个任意的字符

[root@aming-01 ~]# ls

001.txt.bz2  2.txt    321.tar.bz2  3.txt.bak       anaconda-ks.cfg.1  b.txt

002.txt      321      321.tar.gz   aa.txt          a.txt              yum.log

1.txt        321.tar  3.txt        aminglinux.log  bb.txt

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

1.txt  2.txt  3.txt  a.txt  b.txt

[x-y]:x 和 y 可以是任何数,根据方括号中的字符匹配,方括号中的字符只取一个

[root@aming-01 ~]# ls [0-3].txt

1.txt  2.txt  3.txt

[root@aming-01 ~]# ls [a-z].txt

a.txt  b.txt

[root@aming-01 ~]# ls [ab].txt

a.txt  b.txt

[root@aming-01 ~]# ls [123].txt

1.txt  2.txt  3.txt

[root@aming-01 ~]# ls [13].txt

1.txt  3.txt

[x-y]:x 和 y 可以是任何数,根据花括号中的字符匹配,方括号中的字符只取一个,必须要用逗号分隔

[root@aming-01 ~]# ls {13}.txt

ls: 无法访问{13}.txt: 没有那个文件或目录

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

1.txt  3.txt

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

1.txt  2.txt

输入输出重定向

>:把前面命令的输出到后面的文件里面去,会删除后面的文件的内容

[root@aming-01 1]# ls > a.txt

[root@aming-01 1]# cat a.txt

1.txt

2.txt

a.txt

>>:把前面命令的输出到后面的文件里面去,不会删除后面的文件的内容,会在文件内容后面追加

[root@aming-01 1]# ls >> a.txt

[root@aming-01 1]# cat a.txt

1.txt

2.txt

a.txt

1.txt

2.txt

a.txt

2>:把前面命令产生的错误信息输出到后面的文件里面去,会删除后面的文件的内容

[root@aming-01 ~]# lsaaa 2> a.txt

[root@aming-01 ~]# cat a.txt

-bash: lsaaa: 未找到命令

2>>:把前面命令产生的错误信息输出到后面的文件里面去,不会删除后面的文件的内容,会在文件内容后面追加

[root@aming-01 ~]# lsaaa 2>> a.txt

[root@aming-01 ~]# cat a.txt

-bash: lsaaa: 未找到命令

-bash: lsaaa: 未找到命令

&>:把前面命令产生的正确的和错误的信息输出到后面的文件里面去,会删除后面的文件的内容

[root@aming-01 1]# ls [1-2].txt aaa.txt &> a.txt

[root@aming-01 1]# cat a.txt

ls: 无法访问 aaa.txt: 没有那个文件或目录

1.txt

2.txt

&>>:把前面命令产生的正确的和错误的信息输出到后面的文件里面去,不会删除后面的文件的内容,会在文件内容后面追加

[root@aming-01 1]# ls [1-2].txt aaa.txt &>> a.txt

[root@aming-01 1]# cat a.txt

ls: 无法访问 aaa.txt: 没有那个文件或目录

1.txt

2.txt

ls: 无法访问 aaa.txt: 没有那个文件或目录

1.txt

2.txt

把正确和错误的信息分开输出到不同文件中去,会删除后面的文件的内容

[root@aming-01 1]# ls [1-2].txt aaa.txt > a.txt 2> b.txt

[root@aming-01 1]# cat a.txt

1.txt

2.txt

[root@aming-01 1]# cat b.txt

ls: 无法访问 aaa.txt: 没有那个文件或目录

<:输入重定向,把文件内容输入重定向到一个命令里面去,左边必须要是个命令

[root@aming-01 1]# wc -l < a.txt

2

[root@aming-01 1]# a.txt < 1.txt

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