背景

最近处理一个 bug 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 a

最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的。

又经过一番查找,才发现原来是脚本中的一行 echo 引入的。

问题代码

出问题的那行 bash 脚本是这样, echo 一个字符串到某配置文件中。

echo [partition] >> xxx.config

这行平平无奇的代码在大多数人的环境下,确实是正常运行的,但某些情况下会出 bug,那就是当运行脚本的目录下存在特定文件的时候。

复现问题

看看例子,就明白了,其实就是匹配到了文件名。

/$ mkdir /tmp/glob_test && cd /tmp/glob_test
/tmp/glob_test$ echo [partition]
[partition]
/tmp/glob_test$ touch a
/tmp/glob_test$ echo [partition]
a
/tmp/glob_test$ touch o
/tmp/glob_test$ echo [partition]
a o

也就是说出问题的机器上,运行脚本的环境刚好存在一个名为 a 的文件,于是这行脚本的行为就改变了。

本意是写入 [partition] 实际上写入了a

解决也很简单,加上引号。

echo "[partition]" >> xxx.config

glob简介

解决了问题,再回头认识下这个特性。这个叫 glob ,是 bash 的一个特性,可以实现文件名的通配。

最原始可追溯到 UNIX V6,后来就变成了 shell 内建的特性。

当字符串包含了 '?' '*' '[' 的时候就会触发匹配,自动展开成匹配到的文件列表,这个比正则表达式要弱一些,但胜在简单实用。

大家可能经常用到类似于 ls *.c' 之类的功能,这就是 glob 生效的地方。

这里不再详细列出语法,请参考 man 7 glob 或网上诸多文章,例如阮一峰老师就分享过:命令行通配符教程

有一个要注意的地方就是,这个匹配如果失败,就会原样输出,这也是上文的例子在多数情况下能工作的原因。

写在最后

写脚本时该加引号还是得加上的,养成良好的习惯可以少写 bug

另外,虽然 shellcheck 并不能检测到这种情况,但对于提高脚本质量还是很有帮助的,之前也介绍过,可参考:shellcheck 帮助你写出更好的脚本

本文地址: https://www.cnblogs.com/zqb-all/p/12489524.html

公众号: https://sourl.cn/nYkaiK

脚本写一行echo也能写出bug ? glob了解一下的更多相关文章

  1. 为什么你写的用例测不出Bug来?

    我们写测试用例的目的是为了能够整理思路,把要测试的地方列出来,做为知识的积淀,用例可以交给其他测试人员执行,或者是跟需求提出者进行讨论,对用例进行补充和修改.那么为啥你写的用例测不出Bug来呢,真的是 ...

  2. 微软出品自动化神器Playwright,不用写一行代码(Playwright+Java)系列(一) 之 环境搭建及脚本录制

    一.前言 半年前,偶然在视频号刷到某机构正在直播讲解Playwright框架的使用,就看了一会,感觉还不错,便被种草,就想着自己有时间也可以自己学一下,这一想着就半年多过去了. 读到这,你可能就去百度 ...

  3. 推荐一款最强Python自动化神器!不用写一行代码!

    搞过自动化测试的小伙伴,相信都知道,在Web自动化测试中,有一款自动化测试神器工具: selenium.结合标准的WebDriver API来编写Python自动化脚本,可以实现解放双手,让脚本代替人 ...

  4. 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!

    瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...

  5. 不写一行代码,利用常用工具和软件批量下载URL资源

    有时候会遇到这种情况:想从某个网站下载一批东西,目标URL是比较规整的,而且结构都一样(仅某些字段不同).但又懒得开IDE专门写个脚本去弄,今天就和大家分享一下,如何利用手边常用的软件和工具,不用写一 ...

  6. 如何写出测不出bug的测试用例

    我们写测试用例的目的是为了能够整理思路,把要测试的地方列出来,做为知识的积淀,用例可以交给其他测试人员执行,或者是跟需求提出者进行讨论,对用例进行补充和修改. 理论上用例写的越多,越容易发现bug.但 ...

  7. Python将数据写入excel或者txt,读入csv格式或xls文件,写入csv(写一行空一行解决办法)

    1.写入excel,一开始不需要自己新建一个excel,会自动生成 attribute_proba是我写入的对象 import xlwt myexcel = xlwt.Workbook() sheet ...

  8. 快速开发框架(FDMS)新增1000个对外接口都不须要手写一行代码

    一个大型系统难免会跟其它系统有数据交换,这里就要提供数据接口给外部系统. 曾经在一家智能终端设备的公司上班.那段时间的主要工作就是写接口.接口须要与手机.手持设备.系统管理软件等进行数据交换.总结了一 ...

  9. Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4

    Atitit.如何文章写好 论文  文章  如何写好论文 技术博客 1. 原则 2 1.1. 有深度, 有广度 2 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...

随机推荐

  1. selenium中quit与close方法的区别

    https://blog.csdn.net/lbxoqy/article/details/71981222

  2. OpenCV、EmguCV函数注解

  3. ZooTracer:打破传统追踪软件的束缚

    编者按:自今年2月24日起,用户可以免费从官网下载Zootracer试用.这是由来自微软剑桥研究院的Joppa和他的同事研发的桌面工具,可追踪任意画质的视频中任意移动物体行踪,是对对视频画质拍摄要求高 ...

  4. 点分治练习——BZOJ 2152

    做的第二道点分治的题目,比较裸,算是模板题吧(感觉比之前那题还简单点. 题目:BZOJ 2152 聪聪可可 题目大意:给出一棵树,求树上两点间长度为3的倍数(0也算)的路径数. 解题思路: 基本和PO ...

  5. 浮动框架iframe

    浮动框架式一种比较特别的框架,和frame比较类似.不过frame必须在frameset中才可以,而iframe不一样,首先, 他是一种内联框架,其次,他可以放在网页中的任何位置. 所以,iframe ...

  6. VDMA搭建视频通路总结

    全局观查,对整个工程的搭建的关键是要保证PL部分搭建成功,PS部分搭建成功,而且两者配合的很好. 我理解的PL部分涉及到模块的组合以及模块或者IP之间的逻辑的整理,PL部分困扰我比较久的是自动生成的w ...

  7. JavaScript学习总结(一)基础部分

    转自:http://segmentfault.com/a/1190000000652749 基本概念 javascript是一门解释型的语言,浏览器充当解释器. js执行引擎并不是一行一行的执行,而是 ...

  8. 吴裕雄--天生自然HTML学习笔记:HTML 框架

    通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面. iframe语法: <iframe src="URL"></iframe> 该URL指向不同的网 ...

  9. 深度学习之TensorFlow安装与初体验

    深度学习之TensorFlow安装与初体验 学习前 搞懂一些关系和概念 首先,搞清楚一个关系:深度学习的前身是人工神经网络,深度学习只是人工智能的一种,深层次的神经网络结构就是深度学习的模型,浅层次的 ...

  10. struts2和springmvc性能比较2

    我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置.spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外). Spring ...