shell 基础
shell
shell是一个命令解析器,提供用户和机器之间的交互,类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。 支持特定语法,比如逻辑判断,循环等。CentOS 默认的shell是bash ,如果有需要使用zsh,ksh可以使用yum install zsh/ksh 安装
命令历史history
- 存放命令历史的文件叫.bash_history 这个文件在用户的家目录下,默认最多记录1000条,当正常退出终端时,当前敲的命令历史才会从内存写到该文件中。命令历史的最大记录量由$HISTSIZE变量控制,而定义关于history的变量的文件是/etc/frofile。
[root@localhost ~]# echo $HISTSIZE
1000
[root@localhost ~]# vim /etc/profile
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=5000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
- vim /etc/profile的内容有很多,上面只是选取了与history有关的内容 可以通过修改HISTSIZE=1000这个选项的数值来更改最大记录量。不过更改完了之后需要运行source /etc/profile 来使配置生效。
[root@localhost ~]# vim /etc/profile
[root@localhost ~]# !echo
echo $HISTSIZE
1000
[root@localhost ~]# source /etc/profile
[root@localhost ~]# !echo
echo $HISTSIZE
5000
- 如果不想将本次操作的命令历史写入到.bash_history下可以使用history -c 来清除本次操作的命令记录(已写入文件的不会受影响)。如果想查看命令历史也想知道命令是什么时候执行的,可以在/etc/profile中写入一行HISTTIMEFORMAT="%Y/%m/%d%H:%M:%S"
[root@localhost ~]# history
1 2018/06/29 02:03:21ifconfig\
2 2018/06/29 02:03:21ifconfig
3 2018/06/29 02:03:21yum install -y tree
4 2018/06/29 02:03:21tree
5 2018/06/29 02:03:21clear
6 2018/06/29 02:03:21cd
7 2018/06/29 02:03:21cd
8 2018/06/29 02:03:21pwd
9 2018/06/29 02:03:21cd /etc/sysconfig
显示的内容就是如上所示的了。
- 如果想记录所有的历史命令,可以给.bash_history 加一个a权限(只能追加内容) chattr +a ~/.bash_history 就可以了。
- !!两个叹号表示上一条命令
- !n(n是数字)第n条命令
- !command 从命令历史中寻找最近一次运行的以command开头的命令
###别名 alias 命令可以查看系统中所有的做过别名的命令
[root@localhost ~]# 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 rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
也可以使用这个命令做别名,举个例子,重启网络服务systemctl restart network.service ,可以给他做一个简单的别名 ,alias restartnet='systemctl restart network.service'
[root@localhost ~]# alias restartnet='systemctl restart network.service'
[root@localhost ~]# alias restartnet
alias restartnet='systemctl restart network.service'
命令补全
tab键 ,在我们使用命令或者敲路径的时候用tab键会有两种情况出现:
- 命令或路径的前几个字母(我们敲击出来的)是唯一的,系统会自动帮助补全
- 命令或路径的前几个字母(我们敲击出来的)不是唯一的,需要按tab键两下,会列出跟敲击出的字母匹配的选项。
- 默认情况下tab键不会补全参数,如果需要可以安装以下: yum install bash-complation ,重启系统后,tab键就可以补全参数了(还是得遵守上面两条的规则)。
通配符
之前我们使用过命令#ls *.txt#来列出当前目录下以.txt结尾的所有的文件,其中的星号就是通配符。
-
*.txt 表示所有的以.txt结尾的文件
-
txt.*表示所有的以txt.开头的文件
-
*.txt*
表示所有的中间带有.txt的文件 -
?.txt 中的问好也是通配符,表示1个任意的字符(仅仅是一个)
-
[0-3].txt 这个[]也是通配符,表示符合0-3这四个字符的文件(也可以表示成[0123]),例如:1.txt就符合,5.txt就不符合。[]中的内容可以使0-9,a-z ,A-Z 之间的阈值。
-
{1,2}.txt其中{}也是通配符,跟[]类似,但是它们的数字之间有,间隔。这个也比较严谨。
输入输出重定向
- 输出重定向符号>,例如显示1.txt的内容并输出到2.txt文件中
cat 1.txt >2.txt
这个用法会把原先2.txt文件的内容删除,并把1.txt的内容写入到2.txt中。 - 追加重定向符号>>,例如把1.txt的内容显示并追加到2.txt文件中
cat 1.txt >2.txt
这个用法不会删除2.txt的内容,只会把1.txt的内容追加到2.txt中
[root@localhost tmp]# vi 1.txt
[root@localhost tmp]# vi 2.txt
[root@localhost tmp]# cat 1.txt
lilililililili
[root@localhost tmp]# cat 2.txt
chaochaochaochaochaochaochao
[root@localhost tmp]# cat 1.txt >2.txt
[root@localhost tmp]# cat 2.txt
lilililililili
[root@localhost tmp]# cat 1.txt >>2.txt
[root@localhost tmp]# cat 2.txt
lilililililili
lilililililili
- 错误输出重定向2>,比如我们执行一条命令时,命令报错,会把错误信息输出到指定的文件中(会把指定的文件中的内容删除)。
- 错误追加重定向2>>,比如我们执行一条命令式,命令报错,会把错误信息追加到指定的文件中(不会删掉指定文件中的内容)
[root@localhost tmp]# cat 3.txt
cat: 3.txt: 没有那个文件或目录
[root@localhost tmp]# cat 3.txt 2>1.txt
[root@localhost `
tmp]# cat 1.txt
cat: 3.txt: 没有那个文件或目录
[root@localhost tmp]# cat 4.txt 2>>1.txt
[root@localhost tmp]# cat 1.txt
cat: 3.txt: 没有那个文件或目录
cat: 4.txt: 没有那个文件或目录
上面代码显示,当我们cat不存在的3.txt时会提示错误,但我们在命令中加上了2>1.txt错误输出重定向符号,发现,错误信息把1.txt文件中原先的内容替换掉了。然后我们在cat不存在的4.txt时加上了2>>1.txt参数,发现新的报错信息被追加到了1.txt中。
- 有一个将正确信息和错误信息(还是上面那个例子)输出/追加到一个文件中的参数
cat 2.txt 3.txt &>1.txt
[root@localhost tmp]# cat 2.txt 3.txt &>1.txt
[root@localhost tmp]# cat 1.txt
lilililililili
lilililililili
cat: 3.txt: 没有那个文件或目录
[root@localhost tmp]# cat 2.txt 3.txt &>>1.txt
[root@localhost tmp]# cat 1.txt
lilililililili
lilililililili
cat: 3.txt: 没有那个文件或目录
lilililililili
lilililililili
cat: 3.txt: 没有那个文件或目录
- 上面这个可以将正确的信息和错误信息分开输入到不同的文件中
[root@localhost tmp]# cat 1.txt 4.txt>3.txt 2>2.txt
[root@localhost tmp]# cat 3.txt
lilililililili
lilililililili
cat: 3.txt: 没有那个文件或目录
lilililililili
lilililililili
cat: 3.txt: 没有那个文件或目录 这些内容是1.txt中的内容不要搞迷糊了
[root@localhost tmp]# cat 2.txt
cat: 4.txt: 没有那个文件或目录 这个是错误信息输出到了2.txt中
追加跟上面用法一样,不过是把>换成了>>
输入重定向 <
这个符号不常用 是把后面的内容输出给前面的命令来执行,了解一下就好