shell介绍
什么是shell, shell是一个命令解释器,提供用户和机器之间的交互。支持特定语法,比如逻辑判断、循环。每个用户都可以有自己特定的shell。CentOS7默认shell为bash(Bourne Agin Shell)。还有zsh、ksh等。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。
命令历史
查看之前敲过的命令(最大1000条):
history之前敲过的命令会存到/root目录下的这个文件中,你打出的命令不会马上存到配置文件中,会先存在内存中,只有等你退出终端才会保存到配置文件中:
.bash_history查看系统设置的环境变量,命令最大可以存多少条:
echo $HISTSIZE可以清空内存history命令历史,但不会清空配置文件.bash_history里的命令历史:
history -c环境变量HISTSIZE可以在这个配置文件中修改,修改后需输入命令source /etc/profile生效:
/etc/profile指定变量的格式,可以在查看历史命令的同时也可以看到每个命令的执行时间日期,要想永久生效,可以将该命令添加到配置文件/etc/profile中,然后再输入命令source /etc/profile生效:
HISTTIMEFORMAT=”%Y/%m/%d %H:%M:%S “
不想别人删除破坏配置文件中的命令历史,想要永久保存,可以增加隐藏权限a权限(只能追加,不能删除):
chattr +a ~/.bash_history表示执行上一条指令:
!!这里的n是数字,表示执行命令历史中第n条指令,例如 !100 表示执行命令历史中第100个命令:
!n表示执行最后一次执行word命令的命令,例如!echo,表示执行最后一次执行echo命令的命令:
!word
命令补全和别名
命令,路径补全:
tab键 //敲一下补全命令或路径,敲两下会显示跟你输入的命令或路径相似的命令或路径。Centos7里可以自动补全restart或start,但是默认不支持,需要下载相应包之后重启才会生效,安装bash-completion包:
yum install -y bash-completion给命令重新起个名字的命令:
alias
各用户都有自己配置别名的文件~/.bashrc以及/etc/profile.d/目录下的脚本
自定义的alias可写到
~/.bashrc配置文件中,否则重启之后会失效。取消alias命令别名:
unalias + 命令别名
通配符
列出后缀为.txt的所有文件:
ls *.txt列出名称是一个字符的所有.txt文件,?表示一个任意字符:
ls ?.txt列出名称包含0-9中任意一个的一个字符的所有.txt文件:
ls [0-9].txt //也可以是字母如,ls [0-9a-zA-Z].txt列出名称包含1或2中任意一个的一个字符的所有.txt文件:
ls {1,2}.txt
[root@xie-02 zzz]# ls
123123.txt 1.txt 2.txt 312324.txt 3.txt asd.txt gte.txt g.txt h.txt
[root@xie-02 zzz]# ls *.txt //列出后缀为.txt的所有文件
123123.txt 1.txt 2.txt 312324.txt 3.txt asd.txt gte.txt g.txt h.txt
[root@xie-02 zzz]# ls ?.txt //列出名称是一个字符的所有.txt文件,?表示一个任意字符
1.txt 2.txt 3.txt g.txt h.txt
[root@xie-02 zzz]# ls [0-9].txt //列出名称包含0-9中任意一个的一个字符的所有.txt文件
1.txt 2.txt 3.txt
[root@xie-02 zzz]# ls [0-9a-z].txt //列出名称包含0-9和a-z中任意一个的一个字符的所有.txt文件
1.txt 2.txt 3.txt g.txt h.txt
[root@xie-02 zzz]# ls {1,2}.txt //列出名称包含1或2中任意一个的一个字符的所有.txt文件
1.txt 2.txt
输入输出重定向
把1.txt的内容覆盖到2.txt内容中,2.txt的内容会被删除重写:
cat 1.txt >2.txt把1.txt的内容追加到2.txt内容中,2.txt原来的的内容保存,不会被删除重写:
cat 1.txt >> 2.txt把命令的错误信息写入覆盖到err.txt文件中,2>就是错误信息的写入覆盖:
ls aaa.txt 2>err.txt
把命令的错误信息写入追加到err.txt文件中,2>>就是错误信息的写入追加:
ls aaa.txt 2>>err.txt
把命令输出的正常的和错误的信息都写入err.txt文件中,&>为覆盖,&>为追加,例如:
ls [0-3].txt aaa.txt &> err.txt =ls [0-3].txt aaa.txt > err.txt 2>&1
把命令输出的正常的信息都写入right.txt而错误的信息写入err.txt文件中,便于区分,例如:
ls [0-3].txt aaa.txt > right.txt 2> err.txt
把1.txt的内容输入重定向到一个命令中(不常用):
wc -l < 1.txt
扩展知识:
>& :将一个句柄的输出写入到另一个句柄的输入中。
句柄 | 句柄的数字代号 | 描述 |
---|---|---|
STDIN | 0 | 键盘输入 |
STDOUT | 1 | 输出到命令提示符窗口 |
STDERR | 2 | 错误输出到命令提示符窗口 |
UNDEFINED | 3-9 | 句柄由应用程序单独定义,它们是各个工具特有的 |
要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(即 &句柄号)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):2>&1
试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.
你可以用
ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1文件中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。