《UNIX/Linux 系统管理技术手册(第四版)》——2.6 脚本编程的最佳实践

简介:

本节书摘来自异步社区《UNIX/Linux 系统管理技术手册(第四版)》一书中的第2章,第2.6节,作者:【美】Evi Nemeth , Garth Snyder , Trent R.Hein , Ben Whaley著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.6 脚本编程的最佳实践

UNIX/Linux 系统管理技术手册(第四版)
虽然本章里的代码片段几乎不带注释,而且很少打印用法说明,只是因为我们已经列出了每个例子的大纲,从而体现出若干关键点。实际的脚本应该有更好的表现。有几本书通篇就讲编码的最佳实践,不过其中的基本指导原则如下。

如果运行脚本时带了不合适的参数,脚本应该打印一则用法说明,然后再退出。更好的做法是,也以这样的方式实现--help选项。
验证输入的有效性,并检查获得的输入值。例如,在对算出来的一个路径执行rm -fr操作之前,可能要让脚本复查这条路径是否符合期望的模式。此时会发现脚本编程语言的“污点(taint)”功能很有帮助。
返回一个恰当的退出码:0表示成功,非0表示不成功。但是,没有必要非要给每种不成功的模式分配一个唯一的退出码,考虑调用程序实际想要的是什么。

用适当的命名约定来给变量、脚本以及函数起名字。名字要符合该语言的惯例,符合代码库中大部分代码的习惯,最重要的是,符合当前项目里定义的其他变量和函数的惯例。用大小写或者下划线来让长名字可读性更好1。

用变量名反映变量保存的值,但要保持简洁。number_of_lines_of_input这样就太长了;试试用n_lines。

考虑形成一种指导风格,这样一来,你和你的团队成员都可以按照相同的规范来编写代码。有了这样的指导,在阅读别人写的代码,或者别人阅读你写的代码时,都会变得更容易。

每个脚本开头有一段注释,说明该脚本的作用以及它接受的参数。注释里要包括作者的名字和编写日期。如果这个脚本需要在系统上安装非标准的工具、库或者模块,那么也要把它们列出来。

注释要达到的程度是,过一两个月再来看这个脚本,发现注释很有帮助就行了。有关注释的一些要点如下:选择的算法、没有按显然更好的方式去做的理由、代码里不常见的路径,以及在开发期间成为障碍的任何东西。不要到处乱写没用的注释;要假定阅读代码的人不傻,而且熟悉语言。

最好做到代码块级或者函数级的注释。对变量功能的注释说明应该出现在变量声明或者首次使用变量的地方。

以root身份运行脚本是可以的,但要避免设置这些脚本的setuid位;保证setuid的脚本彻底安全相当费事儿。所以代之以用sudo来实现适当的访问控制策略。

对于bash来说,在执行命令之前,先用-x回显命令,用-n检查命令的语法,却不执行它们。

Perl的-w选项可以把某些可疑行为报告给用户,如变量未设置就先使用这样的问题。可以把这个选项加到脚本的“#!”一行里,或者用use warnings打开该程序的文字提示。

在Python中,除非在命令行用-0参数显式地关闭debug(调试)模式,否则就在这个模式下。这意味着,可以在打印诊断输出之前,先测试特殊的debug变量。

对于产生有用的出错消息而言,Tom Christiansen提出了下面5条黄金法则:

出错消息应该送到STDERR而不是STDOUT;
包括发布该出错消息的程序名;
说明什么函数或者操作未成功;
如果一次系统调用失败,那么就要包括perror这个字符串(在Perl里是$!);
用0之外的其他一些出错码退出。
Perl可以轻易遵守所有5条法则:

die  "can’t open $filename: $!";
相关文章
|
22天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
76 1
|
25天前
|
Linux Shell Python
Linux执行Python脚本
Linux执行Python脚本
26 1
|
1月前
|
Linux 数据安全/隐私保护 虚拟化
Linux技术基础(1)——操作系统的安装
本文是龙蜥操作系统(Anolis OS) 8.4 的安装指南,用户可以从[龙蜥社区下载页面](https://openanolis.cn/download)获取ISO镜像。安装方法包括物理机的光驱和USB闪存方式,以及虚拟机中的VMware Workstation Pro设置。安装过程涉及选择语言、配置安装目标、选择软件集合和内核,设置Root密码及创建新用户。安装完成后,可通过文本模式或图形化界面验证系统版本,如Anolis OS 8.4,标志着安装成功。
|
1月前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
71 0
|
2月前
|
存储 安全 Linux
|
1月前
|
存储 Shell Linux
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
26 0
|
1月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
31 1
|
1月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
32 1
|
3月前
|
Shell Linux Perl
将 Linux 系统中 UID 大于等于 1000 的普通用户都删除shell脚本
将 Linux 系统中 UID 大于等于 1000 的普通用户都删除shell脚本
41 1
|
19天前
|
Java Unix Linux
Linux系统常用命令速查手册
Linux系统常用命令速查手册