zoukankan      html  css  js  c++  java
  • Bash技巧:使用 set 内置命令帮助调试 shell 脚本

    Bash技巧:使用 set 内置命令帮助调试 shell 脚本

    霜鱼片发布于 2020-02-03
     

    在 bash 中,可以使用 set 内置命令设置和查看 shell 的属性。
    这些属性会影响 shell 的不同行为。
    下面对一些常用的属性进行说明。

    set 命令

    查看 help set 对 set 命令的说明如下:

    set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
    Change the value of shell attributes and positional parameters, or display the names and values of shell variables.

    Using + rather than - causes these flags to be turned off.

    即,set 命令后面可以跟着要设置的 shell 属性选项。
    如果选项以 - 开头,则是设置为打开该选项。
    如果选项以 + 开头,则是设置为关闭该选项。

    使用 set -e 选项在遇到报错后停止执行

    查看 help set 命令,对 -e 选项说明如下:

    -e
    Exit immediately if a command exits with a non-zero status.

    即,set -e 会在遇到任何非 0 的命令返回值时,退出所在的 shell。

    在脚本开头 #!/bin/bash 语句的下一行添加 set -e 语句,那么执行该脚本时,执行过程中遇到的任何错误都会终止脚本,可以避免执行后续的脚本语句。

    具体举例说明如下:

    #!/bin/bash
    set -e

    从编程的角度来说,set -e 选项的作用跟C语言的 assert() 函数类似,遇到错误就停止。
    在调试 shell 脚本时,如果遇到某个不预期的错误,就可以使用这个选项让脚本及时停止运行,以便找到最接近出错位置的语句。

    使用 set -x 选项打开调试开关

    查看 help set 命令,对 -x 选项说明如下:

    -x
    Print commands and their arguments as they are executed.

    即,set -x 会打印具体执行的命令、以及命令的参数。
    这些参数是经过 bash 扩展后的参数,可以方便看到的各个变量值扩展后的结果是什么、某个变量是否扩展为空导致参数个数发生变化,等等。

    如前面说明,把选项开头的 - 改成 + 会关闭选项,set +x 命令关闭调试开关。

    具体举例如下:

    $ set -x
    $ ls test*
    + ls --color=auto testcase.sh testfile
    $ set +x

    这里先执行 set -x 命令打开调试开关。
    然后执行 ls test* 命令,可以看到扩展后的命令为 ls --color=auto testfile testcase.sh
    从扩展后的结果可以看到 test* 被扩展为当前目录下以 "test" 开头的文件名,有助于理解 * 通配符的扩展结果。

    可以使用类似于下面的语句在 shell 脚本中设置该选项:

    #!/bin/bash
    set -x

    在学习 bash 通配符、各个扩展表达式时,set -x 可以打印出具体的扩展结果,便于理解。

    使用 set -v 回显所输入的命令

    查看 help set 命令,对 -v 选项说明如下:

    -v
    Print shell input lines as they are read.

    即,set -v 选项会回显所输入的命令。

    跟 set -x 的区别在于,set -x 显示的是扩展后的结果,而 set -v 显示的是所输入的命令自身。

    具体举例如下:

    $ set -v
    $ ls test*
    ls test*
    testcase.sh  testfile

    可以看到,设置 set -v 选项后,执行 ls test* 命令,回显的内容就是 "ls test*"。
    而不是回显 test* 扩展之后、以 "test" 开头的文件名。

  • 相关阅读:
    jQuery学习(三)
    HTML基础
    对于跨域问题的解决
    Spring boot 默认静态资源路径与手动配置访问路径
    json:java中前台向后台传对象数据
    javascrit常用互动方法
    java IO流
    HTML中data* 属性
    java中一些对象(po,vo,dao,pojo)等的解释
    使用mybatis generator插件,自动生成dao、dto、mapper等文件
  • 原文地址:https://www.cnblogs.com/xuanbjut/p/14287257.html
Copyright © 2011-2022 走看看