linux sh : 由未实现函数引起bash读取2进制附加数据引起的报错
发布日期:2021-06-30 22:17:12 浏览次数:2 分类:技术文章

本文共 3369 字,大约阅读时间需要 11 分钟。

前言

写好的linux安装包管理脚本附加了tar文件.

运行安装包,本来要执行安装管理脚本,可是没运行,直接报错。说2进制附加数据里面有语法错误.
刚写好的脚本100行左右,开始没看出是哪引起的错误。正常情况是,bash见到exit 0就不执行了,也不会去分析后面的附加数据。
后来用屏蔽法,从最小化的实现开始增量的放开代码。发现是有个函数没实现,有一句脚本的变量使用时多了一个双引号,引起语法不匹配。
用bash -n x.sh,只能查语法错误。这个报错的sh, 用bash -n检查是没错的。感觉bash -n 这个功能做的挺渣的。
可能bash看到了未实现的函数,而且exit 0后面还有实现(其实是2进制附加数据),就去查未实现函数。导致了这种非常奇怪的错误提示。如果提示,也要指出是这个函数未实现才对啊。
找这个bug用了大半天,问题解决后,对bash脚本的编码有了进一步的体会。
* 单元测试,每一个新加入的函数,都要测试通过才往下走,否则等代码写长了,bash报错又那么模糊。不好找问题的初始点了。
* 脚本是弱类型的语言,变量要显示声明,用到的函数要实现,编码要仔细。代码不能拷贝来拷贝去,尽量整理成函数。如果要从其他工程拷贝函数过来,要理清楚,不要留没使用的变量和未实现的子函数。
* 用si当IDE时,可以将Makefile类型的文件规则里面加入sh..sh, 再编辑脚本时,就有语法高亮了,如果有手误的代码,能辅助判断出来一些。当然,用眼睛仔细看还是主要的。
* 为了代码复用,尽量将功能封装成函数(按照功能分布在不同的sh中)再使用。对于安装管理脚本+附加数据这种类型的脚本,就只能将其他sh中封装好的函数都拷贝过来。这时tar文件还没有释放,没有helper可用。
* 对于脚本本身的编程,感觉已经熟悉了,现在就差grep, sed, awk, 正则的进一步学习和练习了。

执行效果

这里写图片描述

脚本实现

#!/bin/bash --posix# 启用bash增强功能 bash --posix# @attention#   bash -n x.sh#   只能检查语法错误, 如果多一个双引号等手误, 报错不准确.#   此时, 用si将*.sh或sh.*作为Makefile文件规则载入, 可以通过语法高亮的块来辅助识别, 不过识别效果也不是很好#   用眼睛分析,还是主要的,#   在加入一个函数时,要用测试用例将这个函数过一遍,确保没问题#   只要新加入的代码,都进行测试,保证增量开发,错了也知道是哪里引起的#   如果带病运行, 等代码行数多了,出现问题再调试,调试工作量增加了不少##   如果调用了不存在的函数,会导致遇到exit0后,还会向后搜索(e.g. one.sh append binary_data_file)#   如果bash分析到2进制文件中,那报错就很难理解了. 所以,要保证脚本中要调用的函数都是存在,可用的#   如果出现了bash搜索到bin文件内容的情况, sh代码一句都跑不起来##   安装管理程序运行时, 文件还没有释放出来, 没有helper可以用#   所有的实现,都要在这个sh中,自己完成# 包含彩色打印接口库# 安装管理实现# __INSTALLER_MANAGER_SH_BEGIN__# --------------------------------------------------------------------------------#!/bin/bash --posix# __SH_COLOR_DEFINE_BEGIN__# --------------------------------------------------------------------------------# @file sh.color_define# @brief print color text#   when print color text, don't use "\n" to end the echo or printf, #   how to use these interface see func_test_color_print()# --------------------------------------------------------------------------------# color basic define# --------------------------------------------------------------------------------<
$temp_file_install_log sed -n -e '1,/^# __INSTALLER_MANAGER_SH_END__/!p' $0 > "$temp_file_path_name" 2>$temp_file_install_log # sed -n -e '1,/^# __INSTALLER_MANAGER_SH_END__/!p' /home/dev/demo/interface/installer_manager.sh printf "tar xzvf $temp_file_path_name -C $temp_dir_install_root 2>>$temp_file_install_log 1>>$temp_file_install_log\n" >>$temp_file_install_log tar xzvf $temp_file_path_name -C $temp_dir_install_root 2>>$temp_file_install_log 1>>$temp_file_install_log rc=$? if [ $G_ERR_CODE_OK -ne $rc ] then PRINT_ERR "unzip tar file failed" cat $temp_file_install_log else PRINT_NOTIFY "unzip tar file ok" COLOR_BEGIN_INFO cd $temp_dir_install_root printf "dir [%s] : \n" $(pwd) ls -l -h -p COLOR_END # run start sh func_is_file_exist $start_sh_file_path_name rc=$? if [ $G_ERR_CODE_OK -eq $rc ] then # tmp_dir/install_root/interface/install.sh chmod 775 $start_sh_file_path_name # 由用户提供的安装脚本接管剩下的安装任务 $start_sh_file_path_name # if no any error, delete temp dir for installer func_delete_file "$temp_dir" else PRINT_WARN "can't find the start shell script" fi fi}mainexit 0# --------------------------------------------------------------------------------# __INSTALLER_MANAGER_SH_END__

转载地址:https://lostspeed.blog.csdn.net/article/details/79393975 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:msdn原版纯c实现的截屏代码
下一篇:linux sh : print color text, show format string have space

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月08日 07时50分26秒