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内置命令 ...
随机推荐
- CMU数据库(15-445) Lab4-CONCURRENCY CONTROL
Lab4- CONCURRENCY CONTROL 拖了很久终于开始做实验4了.lab4有三个大任务1. Lock Manager.2. DEADLOCK DETECTION .3. CONCURRE ...
- 最清晰易懂的 Go WaitGroup 源码剖析
hi,大家好,我是haohongfan. 本篇主要介绍 WaitGroup 的一些特性,让我们从本质上去了解 WaitGroup.关于 WaitGroup 的基本用法这里就不做过多介绍了.相对于< ...
- 解决Linux无法读写U盘中的NTFS问题
1 问题描述 由于笔者因为某些需要把Windows装在了U盘上面(在这里建议一下如果有需要请使用固态U盘),在Linux下挂载时,能读取但并不能写. 2 尝试的解决方案 2.1 remount 一开始 ...
- JetBrains系列IDE无法输入中文
1 问题描述 环境Linux+fcitx,JetBrains的IDE无法输入中文,包括IDEA,PyCharm,WebStorm,CLion等等. 2 解决方案 Linux下一般使用fcitx进入中文 ...
- 一起来看Java设计思想之23种设计模式
目录 怎么使用设计模式 23种设计模式 创建型模式 结构型模式 行为型模式 总结 怎么使用设计模式 为什么要使用设计模式? 编写代码,写接口.写类.写方法 用设计模式做设计的作用是什么? 指导.规定如 ...
- 并发编程之ThreadLocal
并发编程之ThreadLocal 前言 当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这 ...
- git 让忽略.gitignore文件马上生效
在.gitignore文件里面输入 *.zip 表示所有zip文件忽略更改 /bin 表示忽略整个根目录的bin文件夹 /src/aa.jar 表示忽略/src/aa.jar文件 设置完.gitign ...
- 753. Cracking the Safe
There is a box protected by a password. The password is n digits, where each letter can be one of th ...
- Web安全实践
目录 前言 编码安全 反序列化命令执行 SQL 注入 跨站 XSS(Cross-site scripting) 跨站请求伪造 CSRF(Cross-site request forgery) URL跳 ...
- 2. robot framework 关键字,变量,循环
1 关键字的使用 RF的能力是由关键字提供的,所以,我们必须对RF的常用关键字有个了解,这样才能把RF用好. 最常用的关键字就在RF的标准库中 http://robotframework.org 其中 ...