位置: 编程技术 - 正文

写出健壮Bash Shell脚本的一些技巧总结(健壮的什么)

编辑:rootadmin

推荐整理分享写出健壮Bash Shell脚本的一些技巧总结(健壮的什么),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:健壮的含义,健壮这个词,健壮的什么,健壮是形容什么的,健壮的理解,健壮的身体是什么意思,写出健壮的句子,写出健壮的句子,内容如对您有帮助,希望把文章链接给更多的朋友!

许多人用Shell脚本完成一些简单任务,而且变成了他们生命的一部分。不幸的是,shell脚本在运行异常时会受到非常大的影响。在写脚本时将这类问题最小化是十分必要的。本文中我将介绍一些让bash脚本变得健壮的技术。

使用set -u

你因为没有对变量初始化而使脚本崩溃过多少次?对于我来说,很多次。

如果上面的代码你没有给参数就运行,你不会仅仅删除掉chroot中的文档,而是将系统的所有文档都删除。那你应该做些什么呢?好在bash提供了set -u,当你使用未初始化的变量时,让bash自动退出。你也可以使用可读性更强一点的set -o nounset。

使用set -e

你写的每一个脚本的开始都应该包含set -e。这告诉bash一但有任何一个语句返回非真的值,则退出bash。使用-e的好处是避免错误滚雪球般的变成严重错误,能尽早的捕获错误。更加可读的版本:set -o errexit

使用-e把你从检查错误中解放出来。如果你忘记了检查,bash会替你做这件事。不过你也没有办法使用$&#;来获取命令执行状态了,因为bash无法获得任何非0的返回值。你可以使用另一种结构:可以替换成:或者使用:如果你必须使用返回非0值的命令,或者你对返回值并不感兴趣呢?你可以使用 command || true ,或者你有一段很长的代码,你可以暂时关闭错误检查功能,不过我建议你谨慎使用。

相关文档指出,bash默认返回管道中最后一个命令的值,也许是你不想要的那个。比如执行 false | true 将会被认为命令成功执行。如果你想让这样的命令被认为是执行失败,可以使用 set -o pipefail

程序防御 - 考虑意料之外的事

你的脚本也许会被放到“意外”的账户下运行,像缺少文件或者目录没有被创建等情况。你可以做一些预防这些错误事情。比如,当你创建一个目录后,如果父目录不存在,mkdir 命令会返回一个错误。如果你创建目录时给mkdir命令加上-p选项,它会在创建需要的目录前,把需要的父目录创建出来。另一个例子是 rm 命令。如果你要删除一个不存在的文件,它会“吐槽”并且你的脚本会停止工作。(因为你使用了-e选项,对吧?)你可以使用-f选项来解决这个问题,在文件不存在的时候让脚本继续工作。

准备好处理文件名中的空格

有些人从在文件名或者命令行参数中使用空格,你需要在编写脚本时时刻记得这件事。你需要时刻记得用引号包围变量。

当$filename变量包含空格时就会挂掉。可以这样解决:

使用$@变量时,你也需要使用引号,因为空格隔开的两个参数会被解释成两个独立的部分。

我没有想到任何不能使用"$@"的时候,所以当你有疑问的时候,使用引号就没有错误。如果你同时使用find和xargs,你应该使用 -print0 来让字符分割文件名,而不是换行符分割。

设置的陷阱

当你编写的脚本挂掉后,文件系统处于未知状态。比如锁文件状态、临时文件状态或者更新了一个文件后在更新下一个文件前挂掉。如果你能解决这些问题,无论是删除锁文件,又或者在脚本遇到问题时回滚到已知状态,你都是非常棒的。幸运的是,bash提供了一种方法,当bash接收到一个UNIX信号时,运行一个命令或者一个函数。可以使用trap命令。

写出健壮Bash Shell脚本的一些技巧总结(健壮的什么)

你可以链接多个信号(列表可以使用kill -l获得),但是为了清理残局,我们只使用其中的三个:INT,TERM和EXIT。你可以使用-as来让traps恢复到初始状态。

信号描述

INT :Interrupt - 当有人使用Ctrl-C终止脚本时被触发TERM :Terminate - 当有人使用kill杀死脚本进程时被触发EXIT :Exit - 这是一个伪信号,当脚本正常退出或者set -e后因为出错而退出时被触发

当你使用锁文件时,可以这样写:

当最重要的部分(critical-section)正在运行时,如果杀死了脚本进程,会发生什么呢?锁文件会被扔在那,而且你的脚本在它被删除以前再也不会运行了。解决方法:

现在当你杀死进程时,锁文件一同被删除。注意在trap命令中明确地退出了脚本,否则脚本会继续执行trap后面的命令。

竟态条件 (wikipedia)

在上面锁文件的例子中,有一个竟态条件是不得不指出的,它存在于判断锁文件和创建锁文件之间。一个可行的解决方法是使用IO重定向和bash的noclobber(wikipedia)模式,重定向到不存在的文件。我们可以这么做:

更复杂一点儿的问题是你要更新一大堆文件,当它们更新过程中出现问题时,你是否能让脚本挂得更加优雅一些。你想确认那些正确更新了,哪些根本没有变化。比如你需要一个添加用户的脚本。

当磁盘空间不足或者进程中途被杀死,这个脚本就会出现问题。在这种情况下,你也许希望用户账户不存在,而且他的文件也应该被删除。

在脚本最后需要使用trap关闭rollback调用,否则当脚本正常退出的时候rollback将会被调用,那么脚本等于什么都没做。

保持原子化

又是你需要一次更新目录中的一大堆文件,比如你需要将URL重写到另一个网站的域名。你也许会写:

如果修改到一半是脚本出现问题,一部分使用www.example.com,而另一部分使用www.example.net。你可以使用备份和trap解决,但在升级过程中你的网站URL是不一致的。

解决方法是将这个改变做成一个原子操作。先对数据做一个副本,在副本中更新URL,再用副本替换掉现在工作的版本。你需要确认副本和工作版本目录在同一个磁盘分区上,这样你就可以利用Linux系统的优势,它移动目录仅仅是更新目录指向的inode节点。

这意味着如果更新过程出问题,线上系统不会受影响。线上系统受影响的时间降低为两次mv操作的时间,这个时间非常短,因为文件系统仅更新inode而不用真正的复制所有的数据。

这种技术的缺点是你需要两倍的磁盘空间,而且那些长时间打开文件的进程需要比较长的时间才能升级到新文件版本,建议更新完成后重新启动这些进程。对于apache服务器来说这不是问题,因为它每次都重新打开文件。你可以使用lsof命令查看当前正打开的文件。优势是你有了一个先前的备份,当你需要还原时,它就派上用场了。

bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory 在windows系统下写的python脚本,在linux下赋予权限chmod+xxxx.py以后,执行./xxx.py运行提示:bash:/usr/bin/autocrorder:/usr/bin/python^M:badinterpreter:Nosuchfileordirectory分析

Python执行Linux系统命令的4种方法 (1)os.system仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息system(command)-exit_statusExecutethecommand(astring)inasubshell.如果再命令行下执行,结

Shell最多支持多少个参数? 在脚本编写过程中,通常会涉及到参数的输入。譬如,sh1.sh,在执行1.sh这个脚本中,即为第一个参数,即为第二个参数。有时,就会有这个疑惑

标签: 健壮的什么

本文链接地址:https://www.jiuchutong.com/biancheng/379814.html 转载请保留说明!

上一篇:Linux下统计当前文件夹下的文件个数、目录个数(linux命令统计)

下一篇:bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory

  • 收到所得税汇算退税计入补贴收入
  • 水利建设基金按照增值税征收
  • 其他权益工具投资科目编码
  • 专家劳务费可以税前扣除吗
  • 专票地址有误可以用吗
  • 资产报废需要税务登记吗
  • 错误的累计折旧结转会计分录如何调整
  • 购买树木计入什么科目
  • 以前年度税款需要交税吗
  • 股权转让交的税如何做账
  • 定额备用金制度有哪些
  • 我的初级备考经验--跟老师节奏走
  • ppp项目是否纳入政府债务
  • 费用科目如何结转
  • 个人所得税变动率计算公式为多少
  • 钢结构制作安装方案
  • 旅游业是一个怎样的产业
  • 公司注销后款未收完怎么办
  • 企业取得免税收入怎么算
  • 进项税借方有余额要怎么处理
  • 补缴社保差额有滞纳金吗
  • 小企业会计准则成本核算方法选什么
  • 建设项目投资中的预备费包括
  • 苹果手机14pro max
  • 安全的无线连接软件
  • 借条复印件可以起诉吗还有转账记录
  • SUSE Linux Enterprise Server 11 SP3安装教程详解
  • remupd.exe - remupd是什么进程 有什么用
  • 育空怀特霍斯附近的北极光,加拿大 (© Design Pics/Danita Delimont)
  • 珠穆朗玛峰的壮观
  • KITTI数据集可视化(二):点云多种视图与标注展示的可视化代码解析
  • php开发实战权威指南
  • php 表单
  • 预付装修费的会计处理分录
  • 计提费用收到发票后会计分录
  • 企业所得税季度预缴是什么意思
  • 借方和贷方是什么意思 现金日记账
  • 企业有什么项目
  • 支付贷款利息属于筹资活动吗
  • 帝国cms自动采集插件
  • mongorepository排序
  • 累计折旧怎么做账
  • 资产负债表日后事项是指资产负债表日之后至审计报告
  • 普通发票有什么
  • 出口退税中的免税是什么
  • sqlserver定时执行sql
  • sql行列转换结果保存为新表
  • 关于材料采购的通知
  • 文化事业建设费计入什么科目
  • 内账收入按含税还是不含税入
  • 银行进账单需要作为附件吗
  • 应纳税所得额收入总额包括
  • 承包工程合同书
  • 什么发票可以抵扣税
  • 商贸企业固定资产可以一次性扣除吗?
  • 应交税费应交增值税已交税金怎么用
  • 现金日记账怎么划线
  • 营业税金及附加和税金及附加有什么区别
  • mysql数据源
  • mysql在指定字段前添加
  • win7系统权限设置
  • 如果不用2b橡皮擦2b铅笔 能扫的出来吗
  • windows电脑设置
  • win7系统怎么禁止软件自启动
  • windows xp 配置
  • Win10打开或关闭系统图标里开怎么灰色的
  • linux执行sh文件显示不存在
  • win10开机蓝屏提示修复
  • Node.js中的事件循环是什么
  • js获取节点值
  • js对象类
  • 省市区json
  • 安卓 存储权限 访问的地方是哪里
  • 税控盘登录密码忘了怎么办怎么重置
  • 广东省地税局局长 吴
  • 国家河北税务局官网
  • 陕西国税电子税务局app
  • 个体非正常户怎么解除
  • 非房地产企业土地增值税清算
  • 如何查询企业是否注销成功
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设