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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月08日 07时50分26秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AGV自动导引运输车
2019-04-30
Trie树(字典树)
2019-04-30
COMP7404 Machine Learing——ROC
2019-04-30
YAPF —— Python代码格式化工具
2019-04-30
MATLAB与CUDA
2019-04-30
Linux png转jpg (convert命令)
2019-04-30
Ubuntu更新后终端中字体的颜色全是白色
2019-04-30
vscode git
2019-04-30
基于MATLAB的二进制数字调制与解调信号的仿真——2PSK
2019-04-30
基于MATLAB的模拟调制信号与解调的仿真——DSB
2019-04-30
HDU - 1166 敌兵布阵 (树状数组模板题/线段树模板题)
2019-04-30
CodeForces - 761C Dasha and Password (思维 暴力)
2019-04-30
CodeForces - 987C Three displays (暴力/dp)
2019-04-30
牛客国庆集训派对Day4——I 连通块计数(思维)
2019-04-30
牛客国庆集训派对Day5——L 数论之神(找规律/数论)
2019-04-30
CodeForces - 629B Far Relative’s Problem(模拟)
2019-04-30