《A Practical Guide to Linux Commands, Editors, and Shell Programming》之命令行解析

       在我的博文《Linux Shell Scripting Cookbook》Linux常用命令笔记(三)备注【2】中曾提及 命令行的解析,今天看《A Practical Guide to Linux Commands, Editors, and Shell Programming》这本书的时候有讲到 shell 对命令行命令的处理流程,这里做个笔记。

  1. 读入命令后,bash对这行命令进行 history expansion 和 alias subsitution。
    history expansion,比如键入"!!"后回车会进行历史命令扩展,将 "!!" 替换为最近一次执行的命令(用 history 命令可以查看曾经键入的命令)。
    alias substitution,比如root用户一般会在~/.bashrc 中设置 rm 命令的别名:alias rm='rm -i' (用 alias 可以查看现有的命令别名)。

  2. 扫描和解析命令行
    此时bash会将输入的一行命令解析成一个一个的  token。解析完成后,在执行命令之前,还需要遍历 tokens,完成 command-line expansion。
  3. BASH扫描所有解析的tokens,按顺序执行以下几种 expansion 或者 substitution。

  • 1) Brace expansion
  • 括号扩展经常用于表示文件名,但是也可用于产生一般的字符串。注意括号扩展并不试图匹配已有文件名(区别于 "echo *"),示例如下:
    $ ls
    $ echo chap_{one,two,three}.txt
    chap_one.txt chap_two.txt chap_three.txt
    需要注意的是,括号中必须要有逗号分割,不能有未转义的空白符(也就是前加 “\" 转义),否则 bash 不会进行符号扩展。
    $ ls -F
    file1 file2 file3
    $ mkdir vrs{A,B,C,D,E}
    $ ls -F
    file1 file2 file3 vrsA/
     vrsB/
     vrsC/
     vrsD/
     vrsE/

  • 2) Tidle expansion
  • title 也就是 "~" 字符,当它出现在一个 token 的开始处时,会进行特殊对待。如果仅仅有一个 "~",bash 会把它扩展为 root 的home目录;如果"~" 后面跟一个有效用户名,扩展为此用户的 home 目录;否则,不是个有效用户的话就不会进行 Tidle expansion。
    $ echo ~zach
    /home/zach
    $ echo ~root
    /root
    $ echo ~xx
    ~xx
    另外 tidle 也用于 directory stack manipulation。"+" 和 "-" 分别对应于环境变量中的 PWD(当前路径)和 OLDPWD(上次路径)
    $ echo ~+
    /home/commi/test
    $ echo ~-
    /home/commi
  • 3)  Parameter and variable expansion
  • "$" 后面没有跟一个 "(" 会导致进行 Parameter or variable expansion。当然如果 "$"前有 "\" 转义的话又是一说了。
  • 4) Arithmetic expansion 
  • 形式为 "$((expression))" 的字符串,bash 会对expression 进行算术计算,并用求得的值来替换整个字符串(相当于 let)。在括号中若引用了变量,可以不加前导符 "$"
    $ a=$((5+3))
    $ let b=5+3
    $ echo $a $b
    8 8
  • 5) Command ubstitution
  • 对形似 "$(command)" 或 " `command` "(注意为反引号,在键盘感叹号!的左边)的字符串,用command执行的结果来替换原字符串
    $ echo `uname -r`
    3.9.5-301.fc19.x86_64
    $ echo $(pwd)
    /home/commi
  • 6) Word splitting
  • 使用环境变量 IFS 来分割word。
  • 7) Pathname expansion
  • 又叫 filename generation 或者 globbing,对特殊字符 *、?、[ 和 ]进行处理,试着用对应目录下存在文件的文件名来进行补全或匹配,如果匹配失败,不会进行扩展。
    $ ls 
    test1 test2 test3
    $ echo *
    test1 test2 test3
    $ echo test?
    test1 test2 test3
    $ echo test[1-3]
    test1 test2 test3
    $ echo l*
    l*
  • 8) Process substitution
  • 也就是输入输出重定向。

备注

【1】 用双引号包围参数会导致 shell 仅对参数执行Parameter and variable expansion,而不会进行第三步中的其他替换或扩展。用单引号包围则会忽略第三步中的所有替换/扩展。
$ echo tmp* $max
tmp1 tmp2 tmp3 sonar
$ echo "tmp* $max"
tmp * sonar
$ echo 'tmp* $max'
tmp * $max
【2】 google上找到一篇 shell Introduction,里面有介绍 shell operates,参见  Shell Command Language (里面有介绍第2步解析token的—— Token Recognition
为了真正掌握linux必须全面理解shell命令行。以前,读者必须购买两本书才能掌握这些知识:一本介绍linux基本概念和技术的指南,再加一本参考手册。现在,著名linux专家mark sobell通过《linux命令、编辑器与shell编程(第2版)》一本书,不仅全面深入地介绍了系统管理员、开发人员和高级用户最需要的工具,而量涵盖了日常工作中最常用的参考资源。   《linux命令、编辑器与shell编程(第2版)》完全适用于所有发布版,可以把它用于任意linux系统,包括现在和将来发布的linux系统。《linux命令、编辑器与shell编程(第2版)》还全面介绍了mac os x命令行。包括其他linux/unix图书忽略的仅用于os x的工具和实用程序。   本书结构清晰.包含数百个优秀的实际范例,从最基础的知识开始,介绍了linux中最有用的知识,包捶文体系统、shell、编辑器、实用程序、编程工具、正则表达式等。sobell还添加了perl的入门介绍,ped是linux管理员自动完成复杂、耗时的任务最重要的编程工具。 *************************************************************** 请注意: 下载完,评论的同时,请点击评论框上方的五角星(共5个五角星),这样你的被扣的积分就可以返还了。 如果只评论,不点击小五角星,积分不会返还。 一定要先下载完,再评论。如果先评论后下载,或者在下载的过程中评论,积分同样不会返还。 *************************************************************** 更多linux、ARM和C语言资源请参考: http://blog.csdn.net/arkofnoach/archive/2010/10/23/5960560.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值