Bash简介 & Bash是如何处理命令的

什么是shell

简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。

Bash

Unix中有两种主要的shell类别:

  1. Bourne shell − If you are using a Bourne-type shell, the $ character is the default prompt.
  2. C shell − If you are using a C-type shell, the % character is the default prompt.

linux的发布版本之一——Redhat/CentOS——系统默认安装的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢?

  1. 记录命令历史
    我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。
  2. 指令和文件名补全
    按tab键,它可以帮你补全一个指令,也可以帮你补全一个路径或者一个文件名。连续按两次tab键,系统则会把所有的指令或者文件名都列出来。
  3. 别名
    前面也出现过alias的介绍,这个就是bash所特有的功能之一了。我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。
    4 . 通配符
    在bash下,可以使用*来匹配零个或多个字符,而用?匹配一个字符。
  4. 输入输出从定向
    输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>。
  5. 管道符
    前面已经提过过管道符”|”,就是把前面的命令运行的结果丢给后面的命令。
  6. 作业控制。
    当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c)。

Bash如何解析命令

  1. 按行读取命令

  2. 处理引用问题
    双引号内的字符将失去其原有意义,除了$, "\
    单引号内的字符将失去其原有意义,包括$, "\

  3. 将输入的一行字符串按照 ; 分割成多个命令。

  4. 处理特殊字符
    {..}, <(..), < ..., <<< .., .. | ..等特殊字符会被按照特殊的执行次序处理。
    重定向符号会被从命令行中移除,所以在执行命令时... > log, 2>&1这些命令都是不会提交给内核处理命令的进程的。
    其他符号会被其对应的结果表达所替代,如{..}命令:

$ echo {a..c}
a b c
  1. 变量替换
    将带 $ 符号的变量 $parameter替换成变量内容, 术语叫Parameter Expansion.
$ echo $PWD
/z/ros
  1. 将命令行分割成被执行命令和参数
    分割的原则是任何空白(空格、Tab)都将作为分隔符将一整条命令分割成一个一个的词。分割后结果的第一个词作为命令,其他词作为参数。如果命令词中包含空白,需要用引号括起来。
$ My Command /foo/bar   ## This will execute the command named 'My' because it is the first word.
$ "My Command" /foo/bar ## This will execute the command named 'My Command' because the space inside the quotes has lost its special meaning allowing it to split words.
  1. 执行命令
    a. 如果命令是 function or builtin,该命令将会被接收命令的同一个Bash process处理。
    b. 否则 (像是 hadoop fs 等命令), Bash 将会 fork off,创造一个新的Bash子进程,将解析好的命令传递给它,并等待它返回结果。一般情况下,子进程将会继承父进程的标准流

Ref:

  1. 学习 shell 脚本之前的基础知识
  2. The Bash Parser
    原文作者:OldChicken_
    原文地址: https://www.jianshu.com/p/b513087cd7ec
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞