Shell基础(一)

Shell基础(一)

Administrator 997 2018-04-20

本文将介绍shell的功能和一些操作用法,介绍shell的命令历史,命令补全以及命令别名,并使用通配符提高shell操作效率,另外还将介绍shell中如何将输入和输入重定向,如将本应输出到屏幕的命令输出到文件中。


Shell基础(一)

Shell介绍

  • shell是一个命令解释器,提供用户和机器之间的交互;
  • 并且shell支持特定的语法,如逻辑判断、循环等等;
  • 每个用户可以有自己特定的shell,在Centos7中,默认shell为bash,除了bash以外,还有zsh,ksh等等,需要自己安装体验。

命令历史

查看命令历史

  • 在shell中可以使用上下方向键找回之前执行过的命令,实际上这些命令是存储在~/.bash_history文件中;
  • 使用命令history命令可以查看到历史执行过的命令,默认情况下,在.bash_history文件中会存储1000条命令;
  • 历史命令的条数是在系统环境变量$HISTSIZE中定义的,使用history -c可以清空内存中的历史命令,但不能清空文件中记录的历史命令;
  • 用户执行过的命令,在退出登录前都是存储在内存中,退出登录后才会写入到.bash_history文件中去;

配置命令历史

  • 修改历史命令记录的大小,可以修改/etc/profile文件:
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000	# 修改这里的数字即可改变历史命令记录的条数
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi
  • 修改完/etc/profile之后,在下次登录时生效,如果想要立即生效,可以执行source /etc/profile命令;
  • 默认配置记录的命令历史并没有命令执行的时间,可以定义$HISTTIMEFORMAT变量定义命令历史格式,如修改为年/月/日 时:分:秒:
[root@localhost etc]# echo $HISTTIMEFORMAT

[root@localhost etc]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S"
[root@localhost etc]# echo $HISTTIMEFORMAT
%Y/%m/%d %H:%M:%S

[root@localhost etc]# history 
    1  2018/04/20 22:54:45ip addr
    2  2018/04/20 22:54:45dhclient
    3  2018/04/20 22:54:45ip addr
    4  2018/04/20 22:54:45ping www.baidu.com
    5  2018/04/20 22:54:45init 6
    6  2018/04/20 22:54:45ip a
    7  2018/04/20 22:54:45init 0
    8  2018/04/20 22:54:45fdisk -l
    9  2018/04/20 22:54:45fdisk /dev/sdb
  • 配置命令历史格式为默认格式,只需要将HISTTIMEFORMAT变量写入/etc/profile中:
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S"	# 增加变量
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi
  • 记录命令历史的.bash_history文件,可以追溯之前所以执行过的命令,所以可以将其设置为永久保存,给.bash_history增加隐藏权限a,执行命令chattr +a ~/.bash_history增加权限;
  • 在shell中使用!!可以重新执行上一条命令,重复运行指定的命令,使用!n其中n是命令历史的编号,!word其中word是之前执行过的命令的开头单词,这样可以重复执行匹配到的最近一条同样word开头的命令:
[root@localhost etc]# !!
pwd
/etc

[root@localhost etc]# history | head
    1  2018/04/20 22:54:45ip addr
    2  2018/04/20 22:54:45dhclient
    3  2018/04/20 22:54:45ip addr
    4  2018/04/20 22:54:45ping www.baidu.com
    5  2018/04/20 22:54:45init 6
    6  2018/04/20 22:54:45ip a
    7  2018/04/20 22:54:45init 0
    8  2018/04/20 22:54:45fdisk -l
    9  2018/04/20 22:54:45fdisk /dev/sdb
   10  2018/04/20 22:54:45fg
   
[root@localhost etc]# !3
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:4e:b0:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.199.224/24 brd 192.168.199.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::7056:ab3e:1b19:7d4a/64 scope link 
       valid_lft forever preferred_lft forever
       
[root@localhost etc]# !echo
echo "hello world"
hello world

命令补全

  • 使用tab键可以在shell中补全命令或文件路径,当补全的命令或文件存在2个或多个时,需要敲两次tab,只有一个时,敲一次tab即可补全;
  • 增强bash命令补全功能,可以安装bash-completion软件包,安装完成后重启,即可在bash内补全命令的参数;

命令别名

  • 命令别名使用alias命令,用户自己的别名设置,在~/.bashrc文件内;
  • /etc/profile.d/目录下,存在多个shell脚本文件,这是系统定义的命令别名文件;
  • 使用unalias [别名]就可以取消设置的命令别名。

通配符

  • 通配符是指能够指示一类文件的符号,使用通配符匹配文件,能够更快对需要的同一类文件进行处理;
  • 常用的通配符如下表:
通配符命令形式作用
*ls *.txt匹配0个或多个字符
?ls ?.txt匹配一个任意字符
[0-9] [a-z] [0-9a-zA-Z]ls [0-3].txt匹配指定范围内的一个字符
{1,2}ls {1.2.3.a}.txt匹配括号内的一个字符

输入输出重定向

  • 输入输出重定向,可以将命令的输入和输出指向别的命令或文件;
  • 常见的重定向符号如下:
重定向符号命令形式作用
>cat 1.txt > 2.txt将符号左边命令的正确输出覆盖写入到符号右边
>>cat 1.txt >> 2.txt将符号左边命令的正确输出追加到符号右边文件
2>ls aaa.txt 2> err将符号左边命令的错误执行信息,覆盖写入到符号
2>>ls test.txt 2>> err.txt将符号左边命令的错误执行信息,追加写入到符号
&>ls [12].txt aa.txt &> err.txt正确和错误的执行信息,都覆盖输出到符号右边
&>>ls [12].txt aa.txt &>> err.txt正确和错误的执行信息,都输出到符号右边
cmd > x 2> yls 1.txt a.txt > true 2> false将命令执行正确的输出到x,错误的输出到y
cmd > X 2>&1ls /etc/hosts /etc/xzfa > true 2>&1将命令执行的结果不论正确与否,都输出到X文件中
<wc -l < 1.txt输入重定向。将符号右边的内容输入到左边的命令