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.

Tips: 在从Windows或MacOS将文件复制到Linux时,有些文件的文件名可能包含Linux不支持的特殊字符,如空格,#等,如文件名file 1127.txt在Windows下是合法的,但是在Linux不合法,删除这个文件的命令:

$ rm file 1127.txt // not work 
$ rm "file 1127.txt"  // work
  1. 执行命令
    a. 如果命令是 function or builtin,该命令将会被接收命令的同一个Bash process处理。
    b. 否则 (像是 hadoop fs 等命令), Bash 将会 fork off,创造一个新的Bash子进程,将解析好的命令传递给它,并等待它返回结果。一般情况下,子进程将会继承父进程的标准流

Ref:

  1. 学习 shell 脚本之前的基础知识
  2. The Bash Parser
  3. Remove files with names containing strange characters such as spaces, semicolons, and backslashes in Unix
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,717评论 0 5
  • 系统管理与维护命令 date date(选项)(参数) | 选项 | 说明 | | :-------- | ...
    蓓蓓的万能男友阅读 4,190评论 0 5
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 100,723评论 9 468
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 13,268评论 2 33
  • 不要把你的生活排的太满,因为生活能给你的远远超出你的想象,拥抱偶然,点开人生的超链接。 2016.12.18
    刘子逸阅读 200评论 0 0

友情链接更多精彩内容