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" 开头的文件名。

Bash技巧:使用 set 内置命令帮助调试 shell 脚本的更多相关文章

  1. bash内置命令的特殊性,后台任务的"本质"

    本文解释bash内置命令的特殊性.前台.后台任务的"本质",以及前.后台任务和bash进程.终端的关系.网上没类似的资料,所以都是自己的感悟和总结,如有错误,120分的期待盼请指正 ...

  2. Bash内置命令exec和重定向

    Bash内置命令exec可以替换当前程序而不需要启动一个新的进程,可以改变标准输入和输出而不需要启动一个新的子进程.如果文件用exec打开,read命令就会把文件指针每次指向下一行直到文件的末尾,如果 ...

  3. Bash内置命令

    Bash有很多内置命令,因为这些命令是内置的,因此bash不需要在磁盘上为它们定位,执行速度更快. 1)列出所有内置命令列表$enable 2)关闭内置命令test$enable -n test 3) ...

  4. bash内置命令mapfile:读取文件内容到数组

    bash提供了两个内置命令:readarray和mapfile,它们是同义词.它们的作用是从标准输入读取一行行的数据,然后每一行都赋值给一个数组的各元素.显然,在shell编程中更常用的是从文件.从管 ...

  5. Linux bash内置命令集

    man cd  -->查询不到,所以会提示bash的内置命令 . alias bg bind break builtin caller cd command compgen complete c ...

  6. Bash基础——内置命令

    前言 Shell有很多内置在其源代码中的命令.由于命令是内置的,所以Shell不必到磁盘上搜索它们.内置命令执行速度更快,不同的Shell内置命令有所不同. 如何查找内置命令 之前查了好久怎么收索内置 ...

  7. 哪一个 bash 内置命令能够进行数学运算?

    bash shell 的内置命令 let 可以进行整型数的数学运算. #! /bin/bash--let c=a+b--

  8. 哪一个 bash 内置命令能够进行数学运算?

    bash shell 的内置命令 let 可以进行整型数的数学运算. #! /bin/bash - - let c=a+b - -

  9. Linux内置命令

    主要Shell内置命令 Shell有很多内置在其源代码中的命令.这些命令是内置的,所以Shell不必到磁盘上搜索它们,执行速度因此加快.不同的Shell内置命令有所不同. A.2.1 bash内置命令 ...

随机推荐

  1. 网关Ocelot功能演示安排的明明白白~~~

    前言 网关(Gateway)在微服务架构中至关重要,可以将其理解为是外部客户端(前端.MVC后台等调用方)与后台服务的连接点,通过这层可以做统一的处理,比如路由.身份认证和授权.服务治理等: 网关的好 ...

  2. PictureCleaner 官方版 v1.1.3.04061,免费的图片校正及漂白专业工具,专业去除文档图片黑底麻点杂色,规格化A4、B5尺寸输出,还你一个清晰的文本。

    当家长多年,每天都要拍照试卷打印.用App去掉图片黑底就成了每天必备工作.可是,有些图片文件不是来自手机,所以需要一个电脑版的图片漂白工具.经过一个多月努力,PictureCleaner官方版诞生了 ...

  3. css详解background八大属性及其含义

    background(背景) 以前笔者在css盒模型以及如何计算盒子的宽度一文中提到过盒模型可以看成由 元素外边距(margin).元素边框(border).元素内边距(padding)和元素内容(c ...

  4. IntelliJ IDEA/Android Studio插件开发指南

    前言 目前在为安卓手机QQ做自动化的相关工作,包括UI自动化,逻辑层自动化等.使用到的uiautomator等框架,需要在Android Studio进行编码工作. 其中很多工作如果做到插件化的话,可 ...

  5. 《TCP/IP网络编程》学习笔记整理

    简介 本笔记目前已包含 <TCP/IP网络编程>中的前 5 章,后续章节会在近期内补充完整. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔 ...

  6. SpringBoot 启动慢?那是因为你不知道它

    前言 在 2021 年这个小学作文中的未来年份,没有想象中的汽车满天飞,也没有实现机器人满地跑.但牛逼的是我们都有一个共识: 知乎达到了人均 "谢邀~ 人在美国刚下飞机"的生活水平 ...

  7. Sql server注入一些tips

    sql server环境测试: 几个特性: 1.sql server兼容性可以说是最差的. 举例: select x from y where id=1 字符串查询 select x from y w ...

  8. &#127822;

    江湖中有一本练了就能天下无敌的葵花宝典,大家都想得到它.如果有一天葵花宝典被公开了,人人都有机会练,到底是好事还是坏事呢? 这会成为一个灾难. 因为一个人拥有时,练不练是一个人的事.大家都拥有,练不练 ...

  9. php连接MySQL数据库的三种方式(mysql/mysqli/pdo)

    引言 PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案 ...

  10. hdu4861 找规律了

    题意:      给你k个球和一个整数p,每个球的价值是 1^i+2^i+...+(p-1)^i (mod p),两个人轮流取球,最后谁的总价值也大谁就赢,问你先手能不能赢. 思路:      一开始 ...