Linux学习(二十一)Shell基础认识shell命令历史命令补全别名通配符管道符与前后台控制

Posted 阮文武的网络日志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习(二十一)Shell基础认识shell命令历史命令补全别名通配符管道符与前后台控制相关的知识,希望对你有一定的参考价值。

前言

这个系列我们学习shell的基础知识。

一、认识shell

我们经常使用的终端,其实就是一个shell。Bourne开发的shell原本叫shell,后来再版Bourne Again Shell叫做Bash。我们通常使用的shell就是Bash。

二、命令历史

history命令能够记录我们使用过的命令:

[root@ruanwenwu02 ~]# history|tail -n3
  803  history|tail -n3
  804  history
  805  history|tail -n3

history -c能清除我们的history命令:

[root@ruanwenwu02 ~]# history -c
[root@ruanwenwu02 ~]# history
    1  history

我们退出终端,然后再进来,看是不是真的清空了:

实验发现,history -c并不是真的清空了,只是在内存里清除而已。

每个用户的history记录保存在家目录的.bash_history文件里,我们看看:

[root@ruanwenwu02 ~]# vim .bash_history

我们看每条命令前面都有一个编号,我们可以使用这个编号,便捷的使用该条命令:

  809  vim .bash_history history
  810  history
[root@ruanwenwu02 ~]# !809

!!就是使用history中最后一条。

!vim会查找history中最后一条以vim开头的命令并执行。

现在我们讲关于history的两个变量。一个是HISTSIZE,一个是HISTTIMEFORMAT。我们看看这两个变量的值各是多少:

[root@ruanwenwu02 ~]# echo $HISTSIZE
1000
[root@ruanwenwu02 ~]# echo $HISTTIMEFORMAT

[root@ruanwenwu02 ~]#

我们可以在BASH中直接修改他们的值:

[root@ruanwenwu02 ~]# HISTSIZE=2000
[root@ruanwenwu02 ~]# ECHO $HISTSIZE
-bash: ECHO: 未找到命令
[root@ruanwenwu02 ~]# echo $HISTSIZE
2000
[root@ruanwenwu02 ~]# $HISTTIMEFORMAT=\'%Y%m%d %H:%M%s\'
-bash: =%Y%m%d %H:%M%s: 未找到命令
[root@ruanwenwu02 ~]# HISTTIMEFORMAT=\'%Y%m%d %H:%M%s\'
[root@ruanwenwu02 ~]# echo $HISTTIMEFORMAT
%Y%m%d %H:%M%s
[root@ruanwenwu02 ~]# history|tail -n3
  826  20171115 10:331510713238HISTTIMEFORMAT=\'%Y%m%d %H:%M%s\'
  827  20171115 10:341510713243echo $HISTTIMEFORMAT
  828  20171115 10:341510713253history|tail -n3

但是这样的值,在我们退出终端后再进来就会消失:

 821  echo $HISTTIMEFORMAT
 822  :q
 823  exit

如果要保存变量的值,我们可以使用在/etc/profile文件中修改,并source命令或者重新进入终端让改动生效。

vim /etc/profile
#在最末尾添加:
unset -f pathmunge HISTTIMEFORMAT=\'%Y%m%d %H:%M:%s\'

 使用命令source /etc/profile,或者退出后重新登录:

Last login: Wed Nov 15 10:35:09 2017 from 192.168.38.1
[root@ruanwenwu02 ~]# echo $HISTSIZE
2000
[root@ruanwenwu02 ~]# ECHO HISTTIMEFORMAT
-bash: ECHO: 未找到命令
[root@ruanwenwu02 ~]# echo $HISTTIMEFORMAT
%Y%m%d %H:%M:%s
[root@ruanwenwu02 ~]# hist|tail -n3
-bash: hist: 未找到命令
[root@ruanwenwu02 ~]# history|tail -n3
  836  20171115 10:41:1510713665echo $HISTTIMEFORMAT
  837  20171115 10:41:1510713671hist|tail -n3
  838  20171115 10:41:1510713677history|tail -n3

发现修改已经永久生效了。

三、命令补全和别名

要点:

tab敲一下,如果没有相同的内容就会直接补全,如果有相同的就会列出选项。

但是如果想参数也能补全,就需要安装额外的插件:bash-completion:

yum install -y bash-completion

 alias的作用是给命令起别名,它的简单用法:

[root@ruanwenwu02 ~]# alias lsi=\'ls -l\'
[root@ruanwenwu02 ~]# lsi
总用量 80
drwxr-xr-x. 3 root root    28 10月 31 22:10 1
-rw-r--r--. 1 root root  1008 11月  5 20:08 1bak.zip
-rw-r--r--. 1 root root 10240 11月  5 18:43 1.tar

一般个人的alias放在~/.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
~                        

 

在/etc/profile.d目录中也有很多别名。比如:vim /etc/profile.d/colors.sh文件中就有这样的别名定义:

  alias ll=\'ls -l\' 2>/dev/null
  alias l.=\'ls -d .*\' 2>/dev/null

四、通配符

要点:

2>err代表错误输出。wc -l < 1.txt很少用,表示将1.txt的内容输入到wc -l。2>&1表示正确错误都输出到1.txt,也可以这样表示:

[root@ruanwenwu02 profile.d]# cd ~
[root@ruanwenwu02 ~]# ls
1         1.tar      2      3       3.tar.gz  4.tar       4.zip  5.zip  anaconda-ks.cfg.xz
1bak.zip  1.zip.bz2  2.tar  33.tar  3.zip     4.tar.bip2  5      6
[root@ruanwenwu02 ~]# ls 1 333 >> 7.txt 2>&1
[root@ruanwenwu02 ~]# cat 7.txt 
ls: 无法访问333: 没有那个文件或目录
1:
1.txt
2

 

正确和错误分开记录:

[root@ruanwenwu02 ~]# ls 1 333 >> 8.txt 2>> 9.txt
[root@ruanwenwu02 ~]# cat 8.txt 
1:
1.txt
2
[root@ruanwenwu02 ~]# cat 9.txt 
ls: 无法访问333: 没有那个文件或目录 

五、管道符

管道符的作用是将前面命令的标准输出作为后面命令的标准输入,比如:

[root@ruanwenwu02 ~]# ls|wc -l
21
[root@ruanwenwu02 ~]# ls|cat
1
1bak.zip
1.tar
[root@ruanwenwu02 ~]# ls|cat -n3
cat:无效选项 -- 3
Try \'cat --help\' for more information.
[root@ruanwenwu02 ~]# ls |head -n 3
1

xargs和管道符的区别是:xargs是拿前面的输出作为参数,而管道符只是作为标准的输入。例子:

[root@ruanwenwu02 ~]# echo \'--help\'|cat
--help
[root@ruanwenwu02 ~]# echo \'--help\'|xargs cat
用法:cat [选项]... [文件]...
将[文件]或标准输入组合输出到标准输出。

  -A, --show-all           等于-vET
  -b, --number-nonblank    对非空输出行编号
  -e                       等于-vE
  -E, --show-ends          在每行结束处显示"$"
  -n, --number             对输出的所有行编号
  -s, --squeeze-blank      不输出多行空行
  -t                       与-vT 等价
  -T, --show-tabs          将跳格字符显示为^I
  -u                       (被忽略)
  -v, --show-nonprinting   使用^ 和M- 引用,除了LFD和 TAB 之外
      --help            显示此帮助信息并退出
      --version         显示版本信息并退出

如果没有指定文件,或者文件为"-",则从标准输入读取。

示例:
  cat f - g  先输出f 的内容,然后输出标准输入的内容,最后输出g 的内容。
  cat        将标准输入的内容复制到标准输出。

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告cat 的翻译错误
要获取完整文档,请运行:info coreutils \'cat invocation\'

 

六、进程控制

要点:

实验:

[root@ruanwenwu02 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0     12 285228   2784 588204    0    0     2     9   64  103  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   50   86  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   52   81  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   43   70  0  0 100  0  0
^Z
[1]+  已停止               vmstat 1
[root@ruanwenwu02 ~]# jobs
[1]+  已停止               vmstat 1
[root@ruanwenwu02 ~]# bg 1
[1]+ vmstat 1 &
[root@ruanwenwu02 ~]#  3  0     12 285228   2784 588220    0    0     0     0  443  710  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   52   87  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   47   74  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   47   77  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     3   46   78  0  1 99  0  0
 0  0     12 285228   2784 588220    0    0     0     0   47   79  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   55   84  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   50   80  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   52   76  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   49   82  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     4   67   97  1  1 98  0  0
 0  0     12 285228   2784 588220    0    0     0     0   44   74  0  0 100  0  0
 0  0     12 285228   2784 588220    0    0     0     0   45   72  0  0 100  0  0
f 0  0     12 285228   2784 588220    0    0     0     0   55   83  0  0 100  0  0
g 0  0     12 285228   2784 588220    0    0     0     0   53   80  0  1 99  0  0
 0  0     12 285228   2784 588220    0    0     0     0   46   77  0  0 100  0  0
1
-bash: fg1: 未找到命令
[root@ruanwenwu02 ~]#  0  0     12 285148   2784 588220    0    0     0     0   70  103  0  0 100  0  0
f 0  0     12 285148   2784 588220    0    0     0     0   54   85  0  0 100  0  0
g
vmstat 1
 0  0     12 285148   2784 588220    0    0     0     0   65   96  0  1 99  0  0
 0  0     12 285148   2784 588220    0    0     0     0   43   75  0  0 100  0  0
 0  0     12 285148   2784 588220    0    0     0     0   46   72  0  0 100  0  0
^Z
[1]+  已停止               vmstat 1
[root@ruanwenwu02 ~]# 

 

bg命令,能让停止的命令继续在后台运行起来。 

 

以上是关于Linux学习(二十一)Shell基础认识shell命令历史命令补全别名通配符管道符与前后台控制的主要内容,如果未能解决你的问题,请参考以下文章

Linux(二十一)Shell编程

Linux从青铜到王者第二十一篇:Linux网络基础第三篇之数据链路层

shell编程基础

Linux学习(二十二)Shell基础特殊符号sortwcuniqteetrsplit

Linux学习(二十二)Shell基础变量环境变量配置文件

《Linux命令行与shell脚本编程大全》第二十一章 sed进阶