Bash技巧:使用 set 内置命令帮助调试 shell 脚本
Bash技巧:使用 set 内置命令帮助调试 shell 脚本
在 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 脚本的更多相关文章
- bash内置命令的特殊性,后台任务的"本质"
本文解释bash内置命令的特殊性.前台.后台任务的"本质",以及前.后台任务和bash进程.终端的关系.网上没类似的资料,所以都是自己的感悟和总结,如有错误,120分的期待盼请指正 ...
- Bash内置命令exec和重定向
Bash内置命令exec可以替换当前程序而不需要启动一个新的进程,可以改变标准输入和输出而不需要启动一个新的子进程.如果文件用exec打开,read命令就会把文件指针每次指向下一行直到文件的末尾,如果 ...
- Bash内置命令
Bash有很多内置命令,因为这些命令是内置的,因此bash不需要在磁盘上为它们定位,执行速度更快. 1)列出所有内置命令列表$enable 2)关闭内置命令test$enable -n test 3) ...
- bash内置命令mapfile:读取文件内容到数组
bash提供了两个内置命令:readarray和mapfile,它们是同义词.它们的作用是从标准输入读取一行行的数据,然后每一行都赋值给一个数组的各元素.显然,在shell编程中更常用的是从文件.从管 ...
- Linux bash内置命令集
man cd -->查询不到,所以会提示bash的内置命令 . alias bg bind break builtin caller cd command compgen complete c ...
- Bash基础——内置命令
前言 Shell有很多内置在其源代码中的命令.由于命令是内置的,所以Shell不必到磁盘上搜索它们.内置命令执行速度更快,不同的Shell内置命令有所不同. 如何查找内置命令 之前查了好久怎么收索内置 ...
- 哪一个 bash 内置命令能够进行数学运算?
bash shell 的内置命令 let 可以进行整型数的数学运算. #! /bin/bash--let c=a+b--
- 哪一个 bash 内置命令能够进行数学运算?
bash shell 的内置命令 let 可以进行整型数的数学运算. #! /bin/bash - - let c=a+b - -
- Linux内置命令
主要Shell内置命令 Shell有很多内置在其源代码中的命令.这些命令是内置的,所以Shell不必到磁盘上搜索它们,执行速度因此加快.不同的Shell内置命令有所不同. A.2.1 bash内置命令 ...
随机推荐
- 【C/C++】面向对象开发的优缺点
原创文章,转发请注明出处. 面向对象开发的优缺点 面向对象开发 是相对于 面向过程开发 的一种改进思路. 由于流水线式的面相过程开发非常直接,高效.在面对一些简单项目时,只需要几百行,甚至是几十行代码 ...
- Redis解读(2):Redis的Java客户端
Redis的Java客户端 Redis不仅使用命令客户端来操作,而且可以使用程序客户端操作,其实配置和实现起来也非常容易. 现在基本上主流的语言都有客户端支持,比如Java.C.C#.C++.php. ...
- 并发编程-线程池&J.U.C
8. 共享模型之工具 8.1 线程池 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率 ...
- Kubernetes Secrets
Secrets 背景信息 Kubernetes版本 [09:08:04 yhf@test ~]$ kubectl version Client Version: version.Info{Major: ...
- 强大的工具(一):Capslock+ 2.x版本
2020.07.09 更新 作者更新了3.x版本,因此更新了3.x版本的博客,可以戳这里. 本篇文章介绍的是2.x版本. 1 Capslock+简介 Capslock+利用了键盘少用的Capslock ...
- Ambassador-07-熔断
Ambassador的熔断机制的定义 circuit_breakers: - priority: <string> max_connections: <integer> max ...
- 2. Mybatis Select
mybatis select是mybatis 中最常用的元素之一. 对简单的查询,select 元素的配置是相当简单的: <?xml version="1.0" encodi ...
- 善用k8s explain
使用kubectl explain来快速了解用法 例如 kubectl explain deployment.spec 或 kubectl explain deployment.spec.strate ...
- 使用var和不使用var的区别(全局变量/局部变量)
https://blog.csdn.net/czh500/article/details/80429133
- 关于CSS3背景渐变色无效问题
无效的css[linear-gradient]写法 .loginbox{ background-color: linear-gradient(#D0D0D0, #E0E0E0, white); wid ...