8.1shell介绍
8.2命令历史
8.3命令补全和别名
8.4通配符
8.5输入输出重定向
#Linuxshell基础
#8.1shell介绍
-什么是shell
1.shell是一个命令解释器,提供用户和机器之间的交互
2.支持特定语法,比如逻辑判断、循环
3.每个用户都可以有自己特定的shell
4.CentOS7默认shell为bash(BourneAginShell)
5.还有zsh、ksh等
```
[root@aminglinux-01~]#
[root@aminglinux-01~]#yumlist|grepzsh
autojump-zsh.noarch22.3.0-3.el7epel
zsh.x86_645.0.2-25.el7_3.1updates
zsh-html.x86_645.0.2-25.el7_3.1updates
zsh-lovers.noarch0.9.0-1.el7epel
[root@aminglinux-01~]#yumlist|grepksh
ksh.x86_6420120801-26.el7base
mksh.x86_6446-5.el7base
python-XStatic-Rickshaw.noarch1.5.0.0-4.el7epel
python-moksha-common.noarch1.2.3-2.el7epel
python-moksha-hub.noarch1.4.8-1.el7epel
python-moksha-wsgi.noarch1.2.2-2.el7epel
[root@aminglinux-01~]#
```
#8.2命令历史
![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170814/225032244.png?imageslim)
-很多系统里面的命令都是存在用户的家目录下,/root/.bash_history
```
[root@aminglinux-01~]#ls/root/.bash_history
/root/.bash_history
[root@aminglinux-01~]#cat/root/.bash_history
echo$?
yumlist|grep-iapr
yumlist|grep-ipcre
yuminstall-ypcre.x86_64
yuminstall-ypcre-devel.x86_64
./configure--prefix=/usr/local/apache2
echo$?
make
echo$?
makeinstall
echo$?
ls/usr/local/apache2
init0
[root@aminglinux-01~]#
[root@aminglinux-01~]#echo$HISTSIZE
1000
[root@aminglinux-01~]#
```
-这是我们之前存的命令,这个文件里最大可以存1000条
-histroy-c仅仅是把内存当中的命令给清空了,并不会去删除配置文件
```
[root@aminglinux-01~]#history-c
[root@aminglinux-01~]#history
8history
[root@aminglinux-01~]#cat.bash_history
[root@aminglinux-01~]#ls-l.bash_history
-rw-------.1rootroot158108月1223:03.bash_history
[root@aminglinux-01~]#
```
-变量HISTSIZE可以定义的,在/etc/profile
```
[root@aminglinux-01~]#vi/etc/profile
HOSTNAME=`/usr/bin/hostname2>/dev/null`
HISTSIZE=1000
if["$HISTCONTROL"="ignorespace"];then
exportHISTCONTROL=ignoreboth
else
exportHISTCONTROL=ignoredups
fi
exportPATHUSERLOGNAMEMAILHOSTNAMEHISTSIZEHISTCONTROL
#Bydefault,wewantumasktogetset.Thissetsitforloginshell
#Currentthresholdforsystemreserveduid/gidsis200
#Youcouldcheckuidgidreservationvalidityin
```
-可以把HISTSIZE=1000改为5000保存
```
HOSTNAME=`/usr/bin/hostname2>/dev/null`
HISTSIZE=5000
if["$HISTCONTROL"="ignorespace"];then
exportHISTCONTROL=ignoreboth
else
exportHISTCONTROL=ignoredups
fi
exportPATHUSERLOGNAMEMAILHOSTNAMEHISTSIZEHISTCONTROL
#Bydefault,wewantumasktogetset.Thissetsitforloginshell
#Currentthresholdforsystemreserveduid/gidsis200
#Youcouldcheckuidgidreservationvalidityin
--INSERT--
```
-虽然改了,但是并没有生效
```
[root@aminglinux-01~]#vi/etc/profile
[root@aminglinux-01~]#echo$HISTSIZE
1000
[root@aminglinux-01~]#
```
-使用命令source/etc/profile或者重新进入终端,才会生效
```
[root@aminglinux-01~]#source/etc/profile
[root@aminglinux-01~]#echo$HISTSIZE
5000
[root@aminglinux-01~]#
```
-会记录日期时间,这个效果是由环境变量改变的,但是只是在当前终端下生效,
```
[root@aminglinux-01~]#history
8history
9cat.bash_history
10ls-l.bash_history
11vi/etc/profile
12echo$HISTSIZE
13source/etc/profile
14echo$HISTSIZE
15history
[root@aminglinux-01~]#
改变命令历史的格式
[root@aminglinux-01~]#HISTTIMEFORMAT="%Y/%m/%d%H:%M:%S"
[root@aminglinux-01~]#echo$HISTTIMEFORMAT
%Y/%m/%d%H:%M:%S
[root@aminglinux-01~]#history
82017/08/1423:07:03history
92017/08/1423:09:09cat.bash_history
102017/08/1423:10:08ls-l.bash_history
112017/08/1423:28:55vi/etc/profile
122017/08/1423:33:10echo$HISTSIZE
132017/08/1423:34:10source/etc/profile
142017/08/1423:34:13echo$HISTSIZE
152017/08/1423:35:40history
162017/08/1423:39:00HISTTIMEFORMAT="%Y/%m/%d%H:%M:%S"
172017/08/1423:39:15echo$HISTTIMEFORMAT
182017/08/1423:39:28history
[root@aminglinux-01~]#
```
-改变命令历史的格式,这个只针对当前终端下生效,如果想要所有的都生效,需要编辑vi/etc/profile文件把HISTTIMEFORMAT="%Y/%m/%d%H:%M:%S"加入到文件里面vi/etc/profile
```
HOSTNAME=`/usr/bin/hostname2>/dev/null`
HISTSIZE=5000
HISTTIMEFORMAT="%Y/%m/%d%H:%M:%S"加入这一行
if["$HISTCONTROL"="ignorespace"];then
exportHISTCONTROL=ignoreboth
else
exportHISTCONTROL=ignoredups
[root@aminglinux-01~]#vi/etc/profile
[root@aminglinux-01~]#source!$
source/etc/profile
[root@aminglinux-01~]#
```
-这时候再打开另一个终端就可以看到生效了
![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170814/234805048.png?imageslim)
```
[root@aminglinux-01~]#echo$HISTTIMEFORMAT
%Y/%m/%d%H:%M:%S
[root@aminglinux-01~]#
9872017/08/1423:46:55echo$?
9882017/08/1423:46:55yumlist|grep-iapr
9892017/08/1423:46:55yumlist|grep-ipcre
9902017/08/1423:46:55yuminstall-ypcre.x86_64
9912017/08/1423:46:55yuminstall-ypcre-devel.x86_64
9922017/08/1423:46:55./configure--prefix=/usr/local/apache2
9932017/08/1423:46:55echo$?
9942017/08/1423:46:55make
9952017/08/1423:46:55echo$?
9962017/08/1423:46:55makeinstall
9972017/08/1423:46:55echo$?
9982017/08/1423:46:55ls/usr/local/apache2
9992017/08/1423:46:55init0
10002017/08/1423:46:57clear
10012017/08/1423:47:07echo$HISTTIMEFORMAT
10022017/08/1423:48:13history
[root@aminglinux-01~]#
```
-改变命令历史的格式就成功了
-永久保存命令历史chattr+a~/.bash_history
```
[root@aminglinux-01~]#chattr+a~/.bash_history
```
-这样运行过的命令都会记录下来,
-但是如果不正常退出,有时候敲了一些命令,但是你没有logout,exit退出,而是直接关闭终端,那样就会记录不全,命令就保存的不全。
-命令!!2个!其实就是你运行的上一条命令(最后一条命令)
```
[root@aminglinux-01~]#ls
1111_heard.txt1.txt~2343.txtanaconda-ks.cfg.1
1231_sorft.txt1.txt.bak2.txt.bak4.txtbiji.txt
[root@aminglinux-01~]#!!
ls
1111_heard.txt1.txt~2343.txtanaconda-ks.cfg.1
1231_sorft.txt1.txt.bak2.txt.bak4.txtbiji.txt
[root@aminglinux-01~]#
```
-!n表示运行history里面的第n条命令
```
[root@aminglinux-01~]#history
82017/08/1423:07:03history
92017/08/1423:09:09cat.bash_history
102017/08/1423:10:08ls-l.bash_history
112017/08/1423:28:55vi/etc/profile
122017/08/1423:33:10echo$HISTSIZE
132017/08/1423:34:10source/etc/profile
142017/08/1423:34:13echo$HISTSIZE
152017/08/1423:35:40history
162017/08/1423:39:00HISTTIMEFORMAT="%Y/%m/%d%H:%M:%S"
172017/08/1423:39:15echo$HISTTIMEFORMAT
182017/08/1423:39:28history
192017/08/1423:43:15vi/etc/profile
202017/08/1423:45:50source/etc/profile
212017/08/1423:51:50chattr+a~/.bash_history
222017/08/1423:54:18history
232017/08/1423:55:50ls
242017/08/1423:56:13history
[root@aminglinux-01~]#!10
ls-l.bash_history
-rw-------.1rootroot158818月1423:51.bash_history
[root@aminglinux-01~]#
```
-!word它会在命令历史里面倒着往上找第一个有word的命令
-比如运行命令!echo就是运行命令历史里倒着数第一个有ehco相关的命令
```
[root@aminglinux-01~]#history
82017/08/1423:07:03history
92017/08/1423:09:09cat.bash_history
102017/08/1423:10:08ls-l.bash_history
112017/08/1423:28:55vi/etc/profile
122017/08/1423:33:10echo$HISTSIZE
132017/08/1423:34:10source/etc/profile
142017/08/1423:34:13echo$HISTSIZE
152017/08/1423:35:40history
162017/08/1423:39:00HISTTIMEFORMAT="%Y/%m/%d%H:%M:%S"
172017/08/1423:39:15echo$HISTTIMEFORMAT
182017/08/1423:39:28history
192017/08/1423:43:15vi/etc/profile
202017/08/1423:45:50source/etc/profile
212017/08/1423:51:50chattr+a~/.bash_history
222017/08/1423:54:18history
232017/08/1423:55:50ls
242017/08/1423:56:13history
[root@aminglinux-01~]#!10
ls-l.bash_history
-rw-------.1rootroot158818月1423:51.bash_history
[root@aminglinux-01~]#!echo
echo$HISTTIMEFORMAT
%Y/%m/%d%H:%M:%S
[root@aminglinux-01~]#
```
-命令历史里关于ehco的命令是echo$HISTTIMEFORMAT%Y/%m/%d%H:%M:%S,所以!echo就是运行这个命令echo$HISTTIMEFORMAT%Y/%m/%d%H:%M:%S
#8.3命令补全和别名
![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170815/220451944.png?imageslim)
-按tab一下补全命令,tab按俩下列出以命令开头的命令
```
[root@aminglinux-01~]#ls
lslsblklsinitrdlslockslsmodlspci
lsattrlscpulsipclsloginslsnslsscsi
[root@aminglinux-01~]#mk
mkdictmkfifomkfs.ext2mkfs.xfsmknod
mkdirmkfsmkfs.ext3mkhomedir_helpermkpasswd
mkdumprdmkfs.btrfsmkfs.ext4mkinitrdmkswap
mke2fsmkfs.cramfsmkfs.minixmklost+foundmktemp
[root@aminglinux-01~]#mktemp
```
-运行mktab俩下就会显示一堆以mk开头的命令,按mkttab一下就会自动补全mktemp
-centos7里面支持参数补全
1.需要安装一个包
```
[root@aminglinux-01~]#systemctlrestartnetwork^C
[root@aminglinux-01~]#yuminstall-ybash-completion
已安装:
bash-completion.noarch1:2.1-6.el7
完毕!
[root@aminglinux-01~]#
```
2.安装完需要重启下系统才可以reboot或者init6
3.重启系统之后,先看下那个包是否安装,然后输入部分命令尝试按下tab看看是否会补全
```
[root@aminglinux-01~]#rpm-qabash-completion
bash-completion-2.1-6.el7.noarch
[root@aminglinux-01~]#systemctlres
rescuereset-Failedrestart
[root@aminglinux-01~]#systemctlres
rescuereset-Failedrestart
[root@aminglinux-01~]#systemctlres
rescuereset-Failedrestart
[root@aminglinux-01~]#systemctlrestartnetwork
network-online.targetnetwork.service
[root@aminglinux-01~]#systemctlrestartnetwork.service
[root@aminglinux-01~]#
```
-alias别名给名重新起个名字用alias把systemctlrestartnetwork.service改为restartnet
```
[root@aminglinux-01~]#systemctlrestartnetwork.service
[root@aminglinux-01~]#aliasrestartnet='systemctlrestartnetwork.service'
[root@aminglinux-01~]#restartnet
把系统里所有的alias都列出来
[root@aminglinux-01~]#alias
aliascp='cp-i'
aliasegrep='egrep--color=auto'
aliasfgrep='fgrep--color=auto'
aliasgrep='grep--color=auto'
aliasl.='ls-d.*--color=auto'
aliasll='ls-l--color=auto'
aliasls='ls--color=auto'
aliasmv='mv-i'
aliasrestartnet='systemctlrestartnetwork.service'
aliasrm='rm-i'
aliaswhich='alias|/usr/bin/which--tty-only--read-alias--show-dot--show-tilde'
[root@aminglinux-01~]#
```
-取消自定义别名
```
[root@aminglinux-01profile.d]#unaliasrestartnet
[root@aminglinux-01profile.d]#restartnet
-bash:restartnet:未找到命令
[root@aminglinux-01profile.d]#
```
-这些alias存在哪里呢.bashrc,/etc/profile.d
```
[root@aminglinux-01~]#vi.bashrc
#.bashrc
#Userspecificaliasesandfunctions
aliasrm='rm-i'
aliascp='cp-i'
aliasmv='mv-i'
#Sourceglobaldefinitions
if[-f/etc/bashrc];then
./etc/bashrc
fi
~
~
```
2.这个/etc/profile.d文件下面的colorls.sh,colorgrep.sh也有
```
[root@aminglinux-01~]#cd/etc/profile.d
[root@aminglinux-01profile.d]#ls
256term.cshcolorgrep.cshcolorls.shless.cshvim.sh
256term.shcolorgrep.shlang.cshless.shwhich2.csh
bash_completion.shcolorls.cshlang.shvim.cshwhich2.sh
[root@aminglinux-01profile.d]#vicolorls.sh
~
".bashrc"12L,176C
aliasll='ls-l'2>/dev/null
aliasl.='ls-d.*'2>/dev/null
INCLUDE=
COLORS=
forcolorsin"$HOME/.dir_colors.$TERM""$HOME/.dircolors.$TERM"\
"$HOME/.dir_colors""$HOME/.dircolors";do
[-e"$colors"]&&COLORS="$colors"&&\
INCLUDE="`/usr/bin/cat"$COLORS"|/usr/bin/grep'^INCLUDE'|/usr/bin/cut-d''-f2-`"&&\
break
done
/alias
```
3.colorgrep.sh文件也有
```
#color-grepinitialization
/usr/libexec/grepconf.sh-c||return
aliasgrep='grep--color=auto'2>/dev/null
aliasegrep='egrep--color=auto'2>/dev/null
aliasfgrep='fgrep--color=auto'2>/dev/null
~
"colorgrep.sh"7L,201C
```
#8.4通配符
![mark](http://oqxf7c508.bkt.clouddn.com/blog/20170815/223720549.png?imageslim)
-*.txt*表示任何字符
```
[root@aminglinux-01~]#ls
1111_heard.txt1.txt~2343.txtanaconda-ks.cfg.1
1231_sorft.txt1.txt.bak2.txt.bak4.txtbiji.txt
[root@aminglinux-01~]#ls*.txt
1_heard.txt1_sorft.txt3.txt4.txtbiji.txt
[root@aminglinux-01~]#ls*txt
1_heard.txt1_sorft.txt3.txt4.txtbiji.txt
[root@aminglinux-01~]#ls*txt*
1_heard.txt1_sorft.txt1.txt~1.txt.bak2.txt.bak3.txt4.txtbiji.txt
[root@aminglinux-01~]#ls1*
1_heard.txt1_sorft.txt1.txt~1.txt.bak
111:
12.tx~12.txt12_txt.swp2224913aming3
123:
aminglinux.logyum.log
[root@aminglinux-01~]#
```
-ls?.txt?表示一个字符任意的字符
```
[root@aminglinux-01~]#touch2.txt
[root@aminglinux-01~]#touch1.txt
[root@aminglinux-01~]#ls?.txt
1.txt2.txt3.txt4.txt
[root@aminglinux-01~]#toucha.txt
[root@aminglinux-01~]#touchbb.txt
[root@aminglinux-01~]#ls?.txt
1.txt2.txt3.txt4.txta.txt
[root@aminglinux-01~]#
```
-ls[0-9].txt[]13.txt或者的意思
```
[root@aminglinux-01~]#ls[0-3].txt
1.txt2.txt3.txt
[root@aminglinux-01~]#ls[123].txt
1.txt2.txt3.txt
[root@aminglinux-01~]#ls[23].txt
2.txt3.txt
[root@aminglinux-01~]#ls[13].txt
1.txt3.txt
[root@aminglinux-01~]#ls[0-9].txt
1.txt2.txt3.txt4.txt
[root@aminglinux-01~]#ls[0-9a-zA-Z].txt
1.txt2.txt3.txt4.txta.txt
[root@aminglinux-01~]#
```
-ls{1,2}.txt
```
[root@aminglinux-01~]#ls{1,2}.txt
1.txt2.txt
[root@aminglinux-01~]#ls{1,2,3,a}.txt
1.txt2.txt3.txta.txt
[root@aminglinux-01~]#
```
##8.5输入输出重定向
-[]>正确的输出重定向cat1.txt>2.txt
-[]>>正确的追加cat1.txt>>2.txt
-2>错误的输出重定向lsaaa.txt2>err
-2>>错误的追加lsaaa.txt2>>err
```
[root@aminglinux-01~]#lsaaa
-bash:lsaaa:未找到命令
[root@aminglinux-01~]#lsaaa2>a.txt
[root@aminglinux-01~]#cata.txt
-bash:lsaaa:未找到命令
[root@aminglinux-01~]#lsaaa2>>a.txt
[root@aminglinux-01~]#cata.txt
-bash:lsaaa:未找到命令
-bash:lsaaa:未找到命令
[root@aminglinux-01~]#>>>2>2>>>+2>==&>^C
[root@aminglinux-01~]#
```
-&>可以把正确和错误的放一起
```
[root@aminglinux-01~]#ls[12].txtaaa.txt&>a.txt
[root@aminglinux-01~]#cata.txt
ls:无法访问aaa.txt:没有那个文件或目录
1.txt
2.txt
[root@aminglinux-01~]#
```
-&>同样也支持追加
```
[root@aminglinux-01~]#ls[12].txtaaa.txt&>>a.txt
[root@aminglinux-01~]#cata.txt
ls:无法访问aaa.txt:没有那个文件或目录
1.txt
2.txt
ls:无法访问aaa.txt:没有那个文件或目录
1.txt
2.txt
[root@aminglinux-01~]#
```
-&>既可以放正确也可以发个错误的输出信息保存到指定的文件里
```
[root@aminglinux-01~]#ls[12].txtaaa.txt>1.txt2>a.txt
[root@aminglinux-01~]#cat1.txt
1.txt
2.txt
[root@aminglinux-01~]#cata.txt
ls:无法访问aaa.txt:没有那个文件或目录
[root@aminglinux-01~]#
```
-输入重定向把右边的一个文件,文件的内容给它左边输入到一个命令里面去
```
[root@aminglinux-01~]#wc-l<1.txt
2
[root@aminglinux-01~]#2.txt<1.txt
-bash:2.txt:未找到命令
[root@aminglinux-01~]#
```
-[]左边必须是一个命令,不可以是文件输入重定向用的比较少,做一个了解
原文链接:https://www.f2er.com/bash/391078.html